Apelează baza în metoda suprascrisă

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ă!

Lasă un răspuns

Adresa ta de email nu va fi publicată. Câmpurile obligatorii sunt marcate cu *