web-dev-qa-db-fra.com

C # Conception pour forcer la méthode virtuelle à appeler à partir du remplacement ou quelque chose de similaire

Nous pouvons faire quelque chose comme ceci:

// 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
}

J'ai passé 15 bonnes minutes avec une erreur logique parce que j'ai simplement oublié l'appel de la base init.

Mais il n'y a pas de mot-clé à "exiger" ou forcer contractuellement la méthode dérivée pour appeler l'équivalent de base. Donc, si vous oubliez, vous allez passer un mauvais moment dans certains cas où vous devez appeler la base. Ou d'autres fois où vous appelez la base et que la classe dérivée n'était pas nécessaire car elle remplace toutes les valeurs de base plutôt que certaines d'entre elles.

Existe-t-il un moyen de rendre cela plus robuste/strict de sorte que cet oubli ne se produit pas.

4
WDUK

Parce que le même effet pourrait déjà être atteint par un modèle standard de surestimables vides.

Si toutes vos méthodes non scellées ont un corps vide, cela ne compterait pas si elles sont appelées à partir d'une méthode remplacée. Utilisez le modèle de modèle de méthode pour sceller votre implémentation et ne laissez que des méthodes vides exposées pour remplacer:

public sealed override void callMe() {
     before();
     overrideMe();
     after();
}

protected virtual void overrideMe() {
   // left empty to be optionally implemented in children
}

Les méthodes d'étanchéité avec des appels obligatoires et la mise en œuvre ne pourront pas contourner celles-ci.

10
Basilevs