Știu că există întrebări despre apelarea metodei de bază în interiorul unei metode suprascrise, cum ar fi . Dar dacă o metodă suprascrisă numește doar clasa de bază? Este acest lucru rău / bun? Pare ciudat, de ce anulați o metodă doar pentru a apela baza oricum?
De exemplu, consultați:
public class BaseClass { virtual public void Method1() { //Do stuff } } public class InheritingClass : BaseClass { override public void Method1() { base.Method1(); } }
Comentarii
- Nu servește la niciun scop și doar aglomerează codul, așa că scăpați de el.
- @DavidArno that ' este ceea ce am gândit și eu, asigurându-mă doar că nu există ' un motiv pentru asta înainte de a face acest lucru
- Într-o lume ideală, aplicația va fi acoperită de teste unitare, astfel puteți să le eliminați și când toate testele au trecut încă, ' știați că nu este necesar '. ' nu trăim întotdeauna în acea lume ideală, deci a fost logic să întrebăm 🙂
- Singurul motiv pentru care ' ar lăsa codul arătând ca cele de mai sus dacă ar exista mai mult cod în metoda suprascrisă în trecut și ar fi fost eliminat, dar ar putea fi vizualizat prin versiuni vechi în sistemul de control sursă. Dacă lăsați un artefact în codul curent de genul acesta, acesta ar putea semnaliza dezvoltatorului astăzi să vadă istoricul fișierului ' pentru versiunea anterioară a metodei.
Răspuns
Dar dacă o metodă suprascrisă apelează doar clasa de bază? Este acest design rău / bun?
design rău ? Nu, implementare destul de proastă. Este înșelător pentru programatorul de întreținere. Când nu văd o suprascriere, atunci știu se numește baza. O suprascriere îmi spune că există ceva diferit, chiar dacă și baza este apelată acolo.
Necesită o suprascriere pentru a apela baza fără șablon este Proiectare greșită
Fir de referință – răspunsul cel mai popular
Reacția mea inițială la suprascrierea scandinavă model este: CODING HORROR! Se pare că sunt forțat să citesc toate acestea, și mai mult, pentru a mă asigura că „comportamentul secundar” nu îmi rupe codul și invers.
Modelul de metodă șablon este o modalitate bună de a exprima cod variabil în cadrul unui flux de cod mai mare și de a asigura o ordine de execuție corectă.
Din experiența mea, este atât de obișnuit ca o subclasă să știe ce metode declarate de bază să apelăm și în ordine. Luați o mână de subclase, toate cu aceeași structură de control cut-n-paste, adăugați 5 ani de întreținere; acum înțelegeți de ce prefer 101 dovezi Turcia sălbatică .
P.S. Toate acestea sunt un motiv important pentru care mă împotrivesc utilizării excesive a interface
în locul claselor abstract
.
Comentarii
- Excesul de utilizare a interfețelor în C # vine cel mai probabil din faptul că nu dorim să punem în aplicare implementatorul la acea clasă de bază abstractă specifică. Utilizarea unei interfețe permite implementatorului să implementeze clasa de bază anther și nu doar acea clasă abstractă specifică. Depinde însă foarte mult de circumstanțe. Consider că o practică bună este aceea de a avea atât o interfață
IFoo
, cât și o clasăFooBase
, care implementeazăIFoo
interfață, cu apeluri de metode abstracte pentru metode și proprietăți automate pentru recuzită. Poate aruncați și un ctor.
Răspundeți
IMO, virtual
metodele, în clasa de bază, au implementare foarte de bază. Chiar dacă override
definiția metodei virtual
în clasa copil, putem totuși apela virtual
metodă (cu implementare de bază) în timp ce are sens și nu afectează comportamentul preconizat al metodei overridden
din clasa copil.
De exemplu, BaseCalculator face munca reală. Calculator decorează biblioteca BaseCalculator extinzându-l.
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; } }
Î: Ce se întâmplă dacă o metodă suprascrisă apelează doar clasa de bază?
A: În cazul dvs., având metoda clasei de bază ca virtual
, nu trebuie să îl override
până nu vrem să-i schimbăm comportamentul.
Î: Este un lucru rău / bun?
A: Da, ar putea avea un design defect, deoarece ar putea aglomera fișierul codului sursă în timp ce adăugăm modificări inutile.
Î: Pare ciudat, de ce anulați o metodă doar pentru a apela baza oricum?
A: BaseCalculator face lucrarea reală . Calculatorul decorează biblioteca BaseCalculator extinzându-l.
Sper că vă ajută!