可以获取/设置属性的访问器在不同的接口中

本文关键字:接口 访问 获取 设置 属性 | 更新日期: 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; } 
}