A volte ho un codice lungo le linee di questo:
public abstract class A
{
protected abstract void DoSomething();
}
public abstract class B : A
{
/// <inheritdoc />
protected sealed override void DoSomething()
{
SpecialFunctionalityOfClassB();
DoSomethingInternal();
}
private void SpecialFunctionalityOfClassB()
{
// execute functionality i don't want an overwriting class to be able to
// break by not calling base.DoSomething()
// redirect method execution to DoSomethingInternal
}
protected abstract void DoSomethingInternal();
}
public abstract class C : B
{
private void SpecialFunctionalityOfClassC()
{
// execute functionality i don't want an overwriting class to be able to
// break by not calling base.DoSomething()
// redirect method execution to DoSomethingInternal
}
/// <inheritdoc />
protected sealed override void DoSomethingInternal()
{
SpecialFunctionalityOfClassC();
this.DoSomethingElse();
}
protected abstract void DoSomethingElse();
}
Esiste una tecnica di cui non sono a conoscenza per garantire una catena di metodi inderogabile?
Se non dovessi sigillare i metodi, qualcuno potrebbe sovrascrivere un metodo e dimenticare di chiamarne la versione di base. In questo momento non vorrei sapere un altro modo per essere sicuro che chiunque provenga da D avrà tutte le funzionalità eseguite nel modo in cui lo voglio, senza una sottoclasse che rompa quella struttura.