Possiamo fare qualcosa del genere:
// in base class
protected virtual void Init(){
//do stuff that all objects need to do
}
//in derived class
protected override void Init(){
base.Init(); // if you forget this but it compiles all hell breaks loose
//do derived stuff related to this object
}
Ho trascorso 15 minuti buoni con un errore logico perché ho semplicemente dimenticato la chiamata di base init.
Ma non c'è nessuna parola chiave da "richiedere" o forzare contrattualmente il metodo derivato a chiamare l'equivalente di base. Quindi se ti dimentichi, avrai dei brutti momenti in alcuni casi in cui dovrai chiamare la base. O altre volte in cui chiami base e la classe derivata non ne ha bisogno perché sovrascrive tutti i valori di base piuttosto che alcuni di essi.
Esiste un modo per renderlo più robusto / rigoroso in modo tale che tale dimenticanza non si verifichi.