2008-10-27 57 views
3

我有一個名爲「IsSecureConnection」屬性是我的對象的接口的一部分。這對於接口的大部分實現來說都是有意義的,但是在一些實現中,我想使屬性ReadOnly成爲可能。這個屬性應該是我的對象接口的一部分嗎?

即使所有實現都需要該屬性(儘管有時略有不同),我是否應該從該對象的接口中省略該屬性?

謝謝!

回答

3

這實際上取決於您的客戶最具可讀性。我可以想到幾個選項:

1)繼承的接口,雖然我不是一個隱藏的粉絲,我認爲它使任何VB.NET或顯式客戶端實現它有點醜陋:

interface IObject { 
    bool IsSecureConnection { get; } 
    // ... other interface definitions // 
} 

interface ISecurableObject : IObject { 
    new bool IsSecureConnection { get; set; } 
} 

2)從屬性拆分組,具有遺傳接口:

interface IObject { 
    bool IsSecureConnection { get; } 
    // ... other interface definitions // 
} 

interface ISecurableObject : IObject { 
    void SetConnectionSecurity(bool isSecure); 
} 

3)改變語義嘗試並獲得可靠的連接,其實施者是免費的,只是回報錯誤來自:

interface ISecurable { 
    bool IsSecureConnection { get; } 
    bool TrySecureConnection(); 
} 

4)添加額外的檢查屬性:

interface ISecurable { 
    bool IsSecureConnection { get; set; } 
    bool SupportsSecureConnection { get; } 
} 

所有這些都是,IMO,某些情況下是有效的設計。由於我沒有關於用例的任何信息,除了幾乎所有的時候都可以建立安全連接 - 我可能會投3票。這很容易實現,客戶端只有1個代碼路徑,並且有沒有例外機制(這是另一種形式的耦合)。您確實有客戶不檢查TrySecureConnection返回的危險,但我認爲它的問題比其他選擇少。

如果客戶喜歡的安全連接,但不要要求一個 - 然後1有任何需要過載或客戶端的缺點,以檢查是否他們的IObject提取真是ISecurableObject。這兩種都很醜陋。 2有同樣的問題,但沒有麻煩的新/陰影詭計。但是,如果某些客戶端需要安全連接,那麼這個(或2)可能就是要走的路 - 否則,您無法真正使用類型安全來強制實施安全連接。

4,雖然一個有效的設計IMO(有些人會不同意 - 見IO.Stream的反應)很容易讓客戶錯誤。如果90%的實施者是安全的,則不容易檢查SupportsSecureConnection。實施者還可以選擇拋出異常,或者在不支持IsSecureConnection = true的情況下拋出異常,要求客戶端捕獲並檢查IsSecureConnection的新值。

6

只需在界面中添加getter即可。

public interface Foo{ 
    bool MyMinimallyReadOnlyPropertyThatCanAlsoBeReadWrite {get;} 
} 

接口指定對象必須實現的最小值;它沒有說明一個對象不能做什麼。爲此,您需要查看創建基類。

5

接口是像鹽:到處撒上:

public interface ICanBeSecure 
{ 
    bool IsSecureConnection { get; } 
} 

public interface IIsSecureable : ICanBeSecure 
{ 
    bool IsSecureConnection { get; set;} 
} 
+1

儘管動脈硬化和血壓升高雖然;-) – Newtopian 2008-10-27 13:52:35

3

你需要評估的情況。如果它總是可寫的沒有意義,請將其分隔爲第二個界面。

public interface IFoo { 
    bool SecuredConnection{ get; } 
} 

public interface ISecurableOptionFoo: IFoo { 
    bool SecuredConnection{ get; set; } 
} 
+0

你應該有IFecurableOptionFoo從IFoo繼承,所以你可以使用ISecurableOptionFoo無論IFoo被調用。 – 2008-10-27 13:48:07

相關問題