2015-05-12 23 views
0

我正在用C#編寫一個庫,並且爲了絕對確保對象未放置在錯誤的集合和變量中,我想將它們分爲不同的類,儘管這些類完全一樣地完成了同樣的事情。例如:使用具有相同簽名的不同類用於防禦性編程

public class ObjectA 
{ 
    private String name; 

    //... related property 
} 

public class ObjectB 
{ 
    //... exact same as ObjectA 
} 

public class ObjectC 
{ 
    private ObjectB relatedB; 
} 

雖然由A和B所執行的字段和操作是完全相同的,ObjectC的實例必須與對象B和對象B ONLY,從未對象A的實例。

實際上,我有四個具有相同行爲的類,它們必須以這種方式與另外三個類共同關聯。我已經考慮創建一個抽象類,如:

internal abstract class ObjectBase 
{ 
    private String name; 

    //... related property 
} 

當我開始編寫的東西,如隱性和顯性運營商,克隆,而另一些需要直接實例化代碼,就會出現問題。顯然,我不能在抽象類中實現這樣的代碼,但我也不希望ObjectBase在內部或其他地方可用。

我還考慮添加一個「類型」字段 - 作爲枚舉或somesuch - 來區分ObjectBase的實例,而不是一堆空的子類。但是,我不相信別人(或者我自己)足夠高效地使用它,並且希望爲變量增加不同引用(類型)的安全性。

我的問題是,C#是否有這種防禦性編程問題的本地解決方案?如果沒有,有什麼建議嗎?

+9

我不明白你的困境。你絕對可以讓你的抽象基類處理克隆操作。至於不信任你的開發者,這是一個完全獨立的問題。在一天結束時,您必須記錄您的API,在適當的地方提供適當的封裝和訪問修飾符,並讓它們使用您的庫。別忘了,我可以輕鬆地使用反射或AoP以任何我想要的方式改變庫。在某些時候,你只需要讓它成爲現實。 –

+0

什麼是ObjectA,ObjectB和ObjectC的真實生活解釋? – PiotrWolkowski

回答

0

可以使用泛型:

internal abstract class ObjectBase<T> 
{ 
    private String name; 
    protected T related; 
} 

public class ObjectC : ObjectBase<ObjectB> 
{ 
    // will inherits related ObjectB 
} 
相關問題