我想要下一个:
interface INamedObject
{
string Name { get; }
}
interface IRenamableObject : INamedObject
{
string Name { set; }
}
总之,我想创建两个接口,其中一个包含属性的get访问器和另一个 - set访问器。我可以用C#做到这一点吗?
(代码编译但编译器发出以下警告:)
'IRenamableObject.Name'隐藏继承的成员'INamedObject.Name'。如果想要隐藏,请使用new关键字。
答案 0 :(得分:5)
当然可以:
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
属性的对象是只写的,这也有点奇怪......
答案 1 :(得分:0)
IRenamableObject
中定义的属性会隐藏INamedObject
中的属性。
你需要使用
interface IRenamableObject : INamedObject
{
new string Name { get; set; }
}
答案 2 :(得分:0)
是的,您可以在两个不同的界面中拥有Get和Set属性。
但是,主要问题是为什么你需要这样?
它编译,并不意味着它是一个正确的设计。
interface INamedObject
{
string Name { get; }
}
interface IRenamableObject //: INamedObject No need to inherit
{
string Name { set; }
}