Je sais quil y a des questions sur lappel de la méthode de base dans une méthode remplacée telle que ceci . Mais que se passe-t-il si une méthode surchargée nappelle que la classe de base? Est-ce mauvais / bon daigner? Cela semble étrange, pourquoi remplacer une méthode juste pour appeler la base de toute façon?
Par exemple, voir:
public class BaseClass { virtual public void Method1() { //Do stuff } } public class InheritingClass : BaseClass { override public void Method1() { base.Method1(); } }
Commentaires
- Cela ne sert à rien et encombre simplement le code, alors débarrassez-vous-en.
- @DavidArno que ' cest ce que je pensais aussi, en massurant simplement quil ny avait ' aucune raison à cela avant de le faire
- Dans un monde idéal, lapplication sera couverte par tests unitaires, ainsi vous pourriez le supprimer, et quand tous les tests ont encore réussi, vous ' sauriez quil nétait ' t nécessaire. Nous ne vivons pas ' t toujours dans ce monde idéal, il était donc judicieux de demander 🙂
- La seule raison pour laquelle je ' d laisser le code ressemblant à ce que serait ci-dessus sil y avait plus de code dans la méthode remplacée dans le passé, et il a été supprimé, mais pourrait être consulté à travers les anciennes versions dans le système de contrôle de source. Laisser un artefact dans le code actuel comme celui-ci pourrait signaler au développeur aujourdhui de consulter lhistorique du fichier ' pour la version précédente de la méthode.
Réponse
Mais que se passe-t-il si une méthode remplacée nappelle que la classe de base? Est-ce une mauvaise / bonne conception?
mauvaise conception ? Non, mise en œuvre plutôt mauvaise. Cest trompeur pour le programmeur de maintenance. Quand je ne vois pas de surcharge, alors je sais que la base est appelée. Un remplacement me dit quil y a quelque chose de différent, même si la base y est également appelée.
Exiger un remplacement pour appeler la base sans modèle est une mauvaise conception
Sujet référencé – le répondeur le plus populaire
Ma réaction initiale à la dérogation scandinave modèle est: CODING HORROR! Il semble que je sois obligé de lire tout cela, et plus encore, pour massurer que le « sous-comportement » ne casse pas mon code et vice versa.
Le Template Method Pattern est un bon moyen dexprimer du code variable dans un flux de code plus large et dassurer un ordre dexécution correct.
Daprès mon expérience, il est si typique quune sous-classe doive savoir quelles méthodes déclarées de base appeler, et dans lordre. Prenez une poignée de sous-classes, toutes avec la même structure de contrôle couper-coller, ajoutez 5 ans de maintenance; maintenant vous comprenez pourquoi je préfère 101 preuves Wild Turkey .
P.S. Tout cela est une des principales raisons pour lesquelles je moppose à la surutilisation des interface
au lieu des abstract
classes.
Commentaires
- La surutilisation des interfaces en C # vient probablement du fait de ne pas vouloir enchaîner limplémenteur à cette classe de base abstraite spécifique. Lutilisation dune interface permet à limplémenteur dimplémenter une autre classe de base, et pas seulement cette classe abstraite spécifique. Cela dépend cependant beaucoup des circonstances. Je trouve quune bonne pratique est davoir à la fois une interface
IFoo
et une classeFooBase
, qui implémente laIFoo
, avec des appels de méthode abstraits pour les méthodes et des propriétés automatiques pour les accessoires. Peut-être aussi ajouter un ctor.
Réponse
IMO, virtual
, dans la classe de base, ont une implémentation très basique. Même si nous override
la définition de la méthode virtual
dans la classe enfant, nous pouvons toujours appeler la virtual
(avec une implémentation de base) alors que cela a du sens et naffecte pas le comportement prévu de la méthode overridden
dans la classe enfant.
Par exemple, BaseCalculator fait le vrai travail. Calculator décore la bibliothèque BaseCalculator en létendant.
public class BaseCalculator { public virtual T Add<T>(T number01, T number02) { return number01 + number02; } } public class Calculator: BaseCalculator { public override T Add<T>(T number01, T number02) { Console.WriteLine(number01 + " | " + number02); var result = base.Add<int>(1, 3); Console.WriteLine("Result: "+ result); return result; } }
Q: Que faire si une méthode remplacée nappelle que la classe de base?
A: Dans votre cas, avoir la méthode de la classe de base comme virtual
, nous navons pas besoin de override
jusquà ce que nous voulions changer son comportement.
Q: Est-ce mauvais / bon deign?
A: Oui, cela pourrait être mal conçu car cela pourrait encombrer le fichier de code source pendant que nous ajoutons des remplacements inutiles.
Q: Cela semble juste étrange, pourquoi remplacer une méthode juste pour appeler la base de toute façon?
A: BaseCalculator fait le vrai travail . La calculatrice décore la bibliothèque BaseCalculator en létendant.
Jespère que ça aide!