2011-02-09 45 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