我想要下一个:
interface INamedObject
{
string Name { get; }
}
interface IRenamableObject : INamedObject
{
string Name { set; }
}
Run Code Online (Sandbox Code Playgroud)
换句话说,我想创建两个接口,其中一个包含属性的get访问器和另一个 - set accessor.我可以用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);
Run Code Online (Sandbox Code Playgroud)
这是个好主意吗?我不希望它在我的代码中.在我看来,当你得到像这样的古怪时,也许它表明某处存在设计缺陷.一个迹象是,您确实收到一个警告,Name在其中一个界面中影响另一个,因此您需要new关键字,我通常认为这是一种解决方法而不是解决方案.
请注意,接口可以完全相互分离:
interface INamedObject
{
string Name { get; }
}
interface IRenamableObject
{
string Name { set; }
}
Run Code Online (Sandbox Code Playgroud)
这将删除阴影问题.它还允许你拥有一个Name只写属性的对象,这也是一个奇怪的...