2011-02-09 88 views
1

說我有兩種類型:一個子類上計算值的最佳設計模式?

ClassA 
{ 
    int ValueA; 
    int CalculatedA; 
} 

ClassB 
{ 
    int ValueA; 
    int CalculatedA; 

    int ValueB; 
    int CalculatedB; 
} 

CalculatedB需要ValueA以及ValueB。我正在試圖確定實現這一目標的最佳模式。

選項1:子類ClassA並添加額外的值。在子類中有一個常用的Update()方法。這是模型中的簡單代碼,但創建這些類的代碼需要事先知道要創建哪些代碼,並且任何遍歷這些類型列表的代碼都需要進行類型檢查來處理額外的字段。

選項2:在單獨的類中有額外的屬性,並且在那裏有更新代碼CalculatedB。這個問題是,ClassB然後需要知道什麼時候ValueA更新,我希望不必在這些類上實現像INotifyPropertyChanged類似的東西。另一種方法是在額外的屬性類上使用某種公共的Update方法,並在ValueA更新時讓主類調用該方法。也不可取。

方案3:只要有ClassBValueBCalculatedB是可空類型。通過。

還有嗎?你會選擇哪一個?

+0

我不是一個網絡小傢伙。這裏有沒有使用朋友類的東西的可能性? – vrbilgi

+0

雖然朋友會提供幫助,但它與公開內部方法或制定者的問題仍然相同,只是公衆是一個較小的組合。 –

回答

1

如果ClassB與ClassA無關,那麼子類化不是一個好方法。順便說一句,在.net中我們通常不公開公共領域,但公共屬性(假設C#)

public class ClassA{ 
    public int ValueA {get;set;} 
    //... 
} 

由於ClassB.CalculateB在很大程度上依靠值a,爲什麼不計算值上的蒼蠅,所以你不必擔心財產變化。

public class ClassB { 
    public int ValueB {get;set;} 
    public int getCalculateB(ClassA a){ 
     //... 
    } 
} 
+0

這些類是相關的。但另外一個好點。另外我正在使用屬性,我只是懶得寫Get; Set;在問題中的一部分。 –

+0

如果您認爲classB可以繼承classA,那麼爲了避免您在選項1中提到的問題,您可以考慮:重新設計它獲得計算值的方式並使用工廠類/方法來構造類。 – xandy