Come hai detto, le tue opzioni sono protected
e private
.
protected
sembra un buon valore predefinito, ma non dimenticare il caso in cui non desideri che le tue sottoclassi invochino un costruttore specifico. Ad esempio:
public abstract class AbstractBase
{
private AbstractBase(int foo, double bar)
{
this.CalculatedProperty = someComplexCalculation(foor, bar);
}
protected AbstractBase(string XXX, string YYY, int foo, double bar)
: this(foo, bar)
{
this.XXX = XXX;
this.YYY = YYY;
}
protected AbstractBase(string XXX, int foo, double bar)
: this(XXX, "There is no YYY. There is only XXX.", foo, bar)
{
}
// *snip*
}
In questo esempio (eccessivamente semplificato), garantiamo che i valori per foo
, bar
e XXX
siano sempre specificati e che CalculatedProperty
e XXX
siano sempre impostati.
Il costruttore privato ci consente di avere una logica di costruzione condivisa senza duplicazione del codice. E, poiché è privato, le sottoclassi non possono accidentalmente costruirsi parzialmente.