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

时间:2012-01-18 12:33:44

标签: c# .net get set

我想要下一个:

interface INamedObject
{
    string Name { get; }
}

interface IRenamableObject : INamedObject
{
    string Name { set; }
}

总之,我想创建两个接口,其中一个包含属性的get访问器和另一个 - set访问器。我可以用C#做​​到这一点吗?

(代码编译但编译器发出以下警告:)

  

'IRenamableObject.Name'隐藏继承的成员'INamedObject.Name'。如果想要隐藏,请使用new关键字。

3 个答案:

答案 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; } 
}