簡體   English   中英

接口中具有不同訪問器的自動屬性

[英]Auto properties with different accessors in an Interface

這3個自動屬性之間有什么區別嗎?

interface MyInterface {
    public int p1 { get; set; }
    public int p2 { get; }
    public int p3 { set; }
}

還有為什么我們可以在接口中而不是在類中編寫此代碼?

public int p { get; }

出於相同的原因,您可以在接口中編寫此代碼:

interface IFace {
    void Test();
}

另外,您的界面無效,因為public在界面中無效。 關鍵是,接口和類中的不同事物是合法的。

當您執行public int P1 { get; set; } public int P1 { get; set; } public int P1 { get; set; }轉換成一個auto屬性。 但是,您不能執行public int P1 { get; } public int P1 { get; } ,因為您希望這意味着什么? 它應該總是返回0嗎? 無法進行設置。 因此,如果要使用只讀屬性,則必須自己定義getter,如下所示:

int _p1;

public int P1 {
    get { return _p1; }
}

也。 實現或多或少相同的另一種方法是:

public int P1 { get; private set; }

這些屬性之間存在差異。 首先,您應該從聲明中刪除public修飾符。 其次,通過將getset放置在塊中,您可以定義派生類中的什么樣的屬性。 例如, public int p1 { get; set; } public int p1 { get; set; } public int p1 { get; set; }在派生類public int p2 { get; } public int p2 { get; }僅getter,而public int p3 { set; } public int p3 { set; }僅需要執行setter。

您不能在接口內部使用訪問修飾符,因為接口是其他開發人員的指南,這些指南會在開發實現類時迫使它們朝某個方向發展。

有關更多信息,請參見這篇文章。

注意界面不包含任何實施數據。 在接口中添加屬性時,它僅表示實現此接口的類需要具有具有get,set或這兩種方法的屬性,具體取決於您編寫的內容。 因此,任何實現您接口的類都必須使用get和set方法來實現(或具有自動生成的)p1屬性,使用get方法的p2和使用set方法的p3。 Interface不在乎這些是自動生成的還是您自己的自定義實現,它們只需要在實現類中即可。

因此,您可以編寫

int p { get; }

在接口中,它所做的一切都表明,實現此接口的任何類都必須具有帶有getter的屬性p,而不是在乎其實際實現-您可以編寫一個執行一些計算,返回一些常量等操作的getter。編寫相同內容的類意味着您想要一個具有自動生成的后備字段的屬性,但由於它沒有設置器,因此您實際上無法更改其值,因此它將始終具有默認值0。

並且如前所述,您不能在接口中編寫訪問修飾符,因為所有接口成員都是隱式公共的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM