2012-01-18 53 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; } 
}