2011-04-30 70 views
0

問候大家...如何從C#中的接口隱藏已實現屬性的set方法?

如果我有以下接口:

interface IMyInterface 
{ 
    int property { get; set; } 
} 

而下面的實現:

class MyClass : IMyInterface 
{ 
// anything 
} 

我如何隱藏的實例的屬性set方法MyClass ......換句話說,我不希望propertyset方法公開,那有可能嗎?

這將是很容易做到與抽象類:

abstract class IMyInterface 
{ 
    int property { get; protected set; } 
} 

然後我只能setproperty實現上面的抽象類的類內...

回答

2

如果您使用以下接口的設置方法將不可用時類是通過界面操作:

interface IMyInterface 
{ 
    int property { get; } 
} 

然後,您可以實現類是這樣的:

class MyClass : IMyInterface 
{ 
    int property { get; protected set; } 
} 
+0

難道不會從界面中隱藏「屬性」嗎? – Girardi 2011-04-30 20:36:47

+0

它會從界面中移除setter,你仍然可以讀取屬性。 – 2011-04-30 20:38:10

+0

實現類中的setter將不可見,因爲它是在接口中輸入的nit。執行者**將**在實施的類中提供。 – 2011-04-30 20:47:00

7

不具備set在界面中開始。您仍然可以將其實現爲private

你不能「隱藏」它,它是合同的一部分。如果你不希望它成爲合同的一部分,不要定義它。

+0

對不起,我沒有你... – Girardi 2011-04-30 20:29:45

+0

@Girardi得到什麼?如果你在界面中定義它,它將被實現。如果你不想實現它,不要在界面中定義它。 – Oded 2011-04-30 20:32:27

+0

我要實施的一套方法,但我希望它是可見的只是實現接口的類中,而屬性應該連外該類可見... – Girardi 2011-04-30 20:35:02

0

沒有保護或私人界面,一切都是公開的。要麼你沒有定義任何集合或將其用作公共的。

1

假設你需要setter成爲接口的一部分,但由於某些原因,它不適用於特定的實現者(在本例中爲MyClass),您可以隨時在setter中拋出異常(例如InvalidOperationException)。這不會在編譯時保護你,只有在運行時。這有點奇怪,因爲在界面上運行的代碼不知道是否允許調用setter。

1

如果某些實現僅實現接口的某些部分,將接口細分爲每個實現將完全實現或根本不實現的部分可能是一個好主意,然後定義繼承所有常見接口的接口他們的組合。修改您的示例:

 
interface IMyReadableInterface 
{ 
    int property { get; } 
} 
interface IMyFullInterface : IMyReadableInterface 
{ 
    new int property { get; set; } 
} 

想要支持讀寫訪問的類應實現IMyFullInterface;那些只想支持讀訪問的應該只實現IMyReadableInterface。這種隔離不需要任何額外的工作來實現用C#編寫的接口並隱式實現property。在VB中實現property的代碼或在C#中明確實現property的代碼將必須定義property的兩個實現 - 一個只讀的和一個可讀寫的實例,但這就是生活。需要注意的是,雖然人們可以定義一個IMyWritableInterface剛度過一個二傳手,並有IMyFullInterface同時繼承IMyReadableInterfaceIMyWritableInterfaceIMyFullInterface仍然必須定義自己的讀寫性能,以及使用顯式實現時,一會又必須定義三個屬性(我真的不明白爲什麼C#不能像只讀屬性一樣使用只讀和只寫屬性,但它不能)。什麼你不去找 -