2012-01-18 56 views
0

我想是这样的未来:可以获取/设置属性访问器在不同的接口中?

interface INamedObject 
{ 
    string Name { get; } 
} 

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

在的话,我想创建两个接口,其中一个包含get访问的属性和另一个 - set访问。我可以在C#中执行此操作吗?

(代码编译但是编译器提供了以下警告:)

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

+1

这是编译器能够最好地回答的问题之一。 – Nuffin 2012-01-18 12:35:55

+1

你试过了吗? – 2012-01-18 12:36:22

+1

也许你应该得到一个;属性在IRenamableObject也。 – basti 2012-01-18 12:40:32

回答

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属性是只写的这也是一个奇怪的对象...

+0

对于“SomeObject:IRenamableObject类”,这还不够吗?还是我错过了什么? – Glenn 2012-01-18 12:39:42

+0

@Glenn:你是对的。另外,IRenamableObject没有必要继承INamedObject。 – 2012-01-18 12:41:13

+0

不同意_“[这]表示存在某个设计缺陷的想法。”_我有一个完全有效的用例 - 一个完全用于“获取”关于两种不同类型对象的通用空间信息的接口,它们都可以提供类似的数据供读取,但是对于自己的'set'up和internal操作,需要非常不同的数据。话虽如此,我的并没有像你们那样按层次排列(C-> B-> A);我的是(B实现A,C实现A),其中A是只读接口。尽管如此,一个很好的答案。 – 2017-06-03 11:50:06

0

IRenamableObject中定义的属性将隐藏在INamedObject中的属性。 您需要使用

interface IRenamableObject : INamedObject 
{ 
    new string Name { get; set; } 
} 
0

是的,你可以获取和设置在两个不同的接口特性。

但是,主要问题是为什么你需要这种方式?

它编译,并不意味着它是一个正确的设计。

interface INamedObject 
{  
    string Name { get; } 
} 

interface IRenamableObject //: INamedObject No need to inherit 
{  
    string Name { set; } 
}