繁体   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