簡體   English   中英

獲取/設置屬性的訪問器可以位於不同的接口中嗎?

[英]Can Get/Set accessors of property to be in different interfaces?

我想要類似下一個的東西:

interface INamedObject
{
    string Name { get; }
}

interface IRenamableObject : INamedObject
{
    string Name { set; }
}

換句話說,我想創建兩個接口,其中一個包含屬性的get訪問器,另一個包含set訪問器。 我可以在C#中執行此操作嗎?

(代碼可以編譯,但是編譯器會發出以下警告:)

“ IRenamableObject.Name”隱藏繼承的成員“ INamedObject.Name”。 如果要隱藏,請使用new關鍵字。

你當然可以:

interface INamedObject
{
    string Name { get; }
}

interface IRenamableObject : INamedObject
{
    new string Name { set; }
}

class SomeObject : IRenamableObject
{
    public string Name { get; set;  }
}

// usage:
IRenamableObject obj = new SomeObject();
obj.Name = "some name";
Console.WriteLine((obj as INamedObject).Name);

這是個好主意嗎? 我不想在我的代碼中使用它。 在我看來,當您遇到這種奇怪的情況時,也許表明存在某個設計缺陷。 一種跡象表明,您確實會收到警告,其中一個界面中的Name掩蓋另一個界面,因此您需要new關鍵字,我通常認為這是一種解決方法,而不是解決方案。

請注意,接口可以完全彼此分離:

interface INamedObject
{
    string Name { get; }
}

interface IRenamableObject
{
    string Name { set; }
}

這將消除陰影問題。 它還將允許您擁有一個對象,該對象的Name屬性是只寫的,這也有點奇怪...

中定義的屬性IRenamableObject將隱藏在一個INamedObject 您需要使用

interface IRenamableObject : INamedObject
{
    new string Name { get; set; }
}

是的,您可以在兩個不同的界面中具有“獲取”和“設置”屬性。

但是,主要問題是為什么您需要這種方式?

它可以編譯,並不意味着它是正確的設計。

interface INamedObject 
{     
    string Name { get; } 
}

interface IRenamableObject //: INamedObject No need to inherit
{     
    string Name { set; } 
} 

暫無
暫無

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

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