我有一個名爲「IsSecureConnection」屬性是我的對象的接口的一部分。這對於接口的大部分實現來說都是有意義的,但是在一些實現中,我想使屬性ReadOnly成爲可能。這個屬性應該是我的對象接口的一部分嗎?
即使所有實現都需要該屬性(儘管有時略有不同),我是否應該從該對象的接口中省略該屬性?
謝謝!
我有一個名爲「IsSecureConnection」屬性是我的對象的接口的一部分。這對於接口的大部分實現來說都是有意義的,但是在一些實現中,我想使屬性ReadOnly成爲可能。這個屬性應該是我的對象接口的一部分嗎?
即使所有實現都需要該屬性(儘管有時略有不同),我是否應該從該對象的接口中省略該屬性?
謝謝!
這實際上取決於您的客戶最具可讀性。我可以想到幾個選項:
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的新值。
只需在界面中添加getter即可。
public interface Foo{
bool MyMinimallyReadOnlyPropertyThatCanAlsoBeReadWrite {get;}
}
接口指定對象必須實現的最小值;它沒有說明一個對象不能做什麼。爲此,您需要查看創建基類。
接口是像鹽:到處撒上:
public interface ICanBeSecure
{
bool IsSecureConnection { get; }
}
public interface IIsSecureable : ICanBeSecure
{
bool IsSecureConnection { get; set;}
}
你需要評估的情況。如果它總是可寫的沒有意義,請將其分隔爲第二個界面。
public interface IFoo {
bool SecuredConnection{ get; }
}
public interface ISecurableOptionFoo: IFoo {
bool SecuredConnection{ get; set; }
}
你應該有IFecurableOptionFoo從IFoo繼承,所以你可以使用ISecurableOptionFoo無論IFoo被調用。 – 2008-10-27 13:48:07
儘管動脈硬化和血壓升高雖然;-) – Newtopian 2008-10-27 13:52:35