То, как вы это делаете, является очень типичным паттерном, и в этом нет ничего плохого - так обычно делают подобные вещи. Невозможно заставить этот вызов base
предположить, что когда и где это происходит, всегда зависит от разработчика. Если вы действительно заинтересованы в его форсировании, вам следует рассмотреть возможность использования защищенного события:
public abstract class AbsCurveBased
{
internal Curve baseShape;
double Area{get;set;}
public AbsCurveBased(Curve baseShape)
{
this.baseShape = baseShape;
RefreshFromBaseShape();
}
public void RefreshFromBaseShape()
{
//sets the Area property from the baseShape
...
// call child handlers
var handler = RefreshingFromBaseShape;
if (handler != null)
handler();
}
protected event Action RefreshingFromBaseShape;
}
public class Shell : Extrusion
{
double ShellVolume{get;set;}
double ShellThickness{get;set;}
public Shell(Curve baseShape): base(baseShape)
{
this.RefreshingFromBaseShape += RefreshingFromBaseShapeHandler;
this.baseShape = baseShape;
RefreshFromBaseShape();
}
private void RefreshingFromBaseShapeHandler()
{
//sets this Shell Volume from the Extrusion properties and ShellThickness property
}
}
Таким образом, любой класс в цепочке наследования контролирует только своих обработчиков и не может отменить регистрацию обработчиков своих предков или вставить их в цепочку до того, как предки вставят свои.
Однако для вашего конкретного случая это кажется слишком большой сложностью, ничего не стоящей.
Кроме того, если RefreshFromBaseShape
вызывается только из конструктора, то, возможно, он должен быть параметром этого конструктора. Рассмотрим:
public abstract class AbsCurveBased
{
internal Curve baseShape;
double Area{get;set;}
public AbsCurveBased(Curve baseShape)
{
this.baseShape = baseShape;
//sets the Area property from the baseShape
}
protected AbsCurveBased(Curve baseShape, Action refreshFromBaseShape):
this(baseShape)
{
refreshFromBaseShape();
}
}
public class Shell : Extrusion
{
double ShellVolume{get;set;}
double ShellThickness{get;set;}
public Shell(Curve baseShape):
base(baseShape, RefreshFromBaseShape)
{
}
protected Shell(Curve baseShape, Action refreshFromBaseShape):
this(baseShape)
{
refreshFromBaseShape();
}
private void RefreshFromBaseShape()
{
//sets this Shell Volume from the Extrusion properties and ShellThickness property
}
}