我正在为3D建模程序编写一个插件。我有一个自定义的类,它包装3D模型中的元素实例,并依次从它包装的元素派生它的属性。当模型中的元素发生变化时,我希望我的类根据新的几何体更新它们的属性。有没有办法自动调用所有版本的继承方法?
在下面的简化示例中。我有AbsCurveBasd类,Extrusion和Shell类,它们都是相互派生的。这些类中的每一个都实现了一个RefreshFromBaseShape()方法,该方法根据类正在包装的当前baseShape更新特定属性。
我可以在RefreshFromBaseShape()的每个实现中调用base.RefreshFromBaseShape()以确保更新所有属性。但是我想知道是否有更好的方法,我不必记得在RefershFromBaseShape()的每个实现中都这样做?例如,因为AbsCurveBased没有无参数构造函数,代码甚至不会编译,除非构造函数调用基类构造函数。
public abstract class AbsCurveBased
{
internal Curve baseShape;
double Area{get;set;}
public AbsCurveBased(Curve baseShape)
{
this.baseShape = baseShape;
RefreshFromBaseShape();
}
public virtual void RefreshFromBaseShape()
{
//sets the Area property from the baseShape
}
}
public class Extrusion : AbsCurveBased
{
double Volume{get;set;}
double Height{get;set;}
public Extrusion(Curve baseShape):base(baseShape)
{
this.baseShape = baseShape;
RefreshFromBaseShape();
}
public override void RefreshFromBaseShape()
{
base.RefreshFromBaseShape();
//sets the Volume property based on the area and the height
}
}
public class Shell : Extrusion
{
double ShellVolume{get;set;}
double ShellThickness{get;set;}
public Shell(Curve baseShape): base(baseShape)
{
this.baseShape = baseShape;
RefreshFromBaseShape();
}
public void RefreshFromBaseShape()
{
base.RefreshFromBaseShape();
//sets this Shell Volume from the Extrusion properties and ShellThickness property
}
}
啊,是啊我在想我有什么事情可以做,涉及事件或分立。但是,这并没有让事情变得简单,只是使用base.RefreshFromBaseShape() – 2009-12-16 00:20:27
它并没有让它变得更简单。它只是保证没有派生类能够跳过他的祖先提供的代码(尽管它仍然可以切断它的任何后代)。 – 2009-12-16 00:46:56