可以获取/设置属性的访问器在不同的接口中
本文关键字:接口 访问 获取 设置 属性 | 更新日期: 2023-09-27 18:20:34
我想要类似下一个的东西:
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; }
}
是的,您可以在两个不同的接口中拥有Get和Set属性。
但是,主要的问题是,为什么你们需要这样
它可以编译,并不意味着它是一个正确的设计。
interface INamedObject
{
string Name { get; }
}
interface IRenamableObject //: INamedObject No need to inherit
{
string Name { set; }
}