我正在爲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