Jeg vet at det er spørsmål om å kalle basemetoden i en overstyrt metode som dette . Men hva om en overstyrt metode bare kaller basisklassen? Er dette dårlig / god verdighet? Det virker bare rart, hvorfor overstyre en metode bare for å ringe basen uansett?
Se for eksempel:
public class BaseClass { virtual public void Method1() { //Do stuff } } public class InheritingClass : BaseClass { override public void Method1() { base.Method1(); } }
Kommentarer
- Det tjener ingen hensikt og bare roter koden, så kvitt den.
- @DavidArno at ' det jeg trodde også, bare sørget for at det ikke var ' en grunn til det før jeg gjorde det
- I en ideell verden vil appen dekkes av enhetstester, slik at du kan fjerne den, og når testene fremdeles er bestått, vet du ' at det ikke var nødvendig '. Vi lever ikke ' alltid i den ideelle verden, så det var fornuftig å spørre 🙂
- Den eneste grunnen til at jeg ' la koden se ut som om det ville være om det tidligere var mer kode i den overstyrte metoden, og den ble fjernet, men kunne sees gjennom gamle versjoner i kildekontrollsystemet. Hvis du etterlater en gjenstand i den gjeldende koden som denne, kan det signalisere til utvikleren i dag om å se filen ' s historie for den forrige versjonen av metoden.
Svar
Men hva om en overstyrt metode bare kaller basisklassen? Er dette dårlig / bra design?
Dårlig design ? Nei, ganske dårlig gjennomføring. Det er villedende for vedlikeholdsprogrammereren. Når jeg ikke ser en overstyring, vet jeg at basen heter. En overstyring forteller meg at det er noe annet, selv om basen også blir kalt inn der.
Krever en overstyring for å ringe basen uten mal er dårlig design
Referert tråd – mest populære answser
Min første reaksjon på den skandinaviske overstyringen modell er: CODING HORROR! Det ser ut til at jeg er tvunget til å lese alt dette, og deretter mer, for å sørge for at «underadferd» ikke bryter koden min og omvendt.
Malmetodemønster er en god måte å uttrykke variabel kode i noen større kodestrømmer og sikre riktig utførelsesrekkefølge.
Etter min erfaring er det så typisk for en underklasse å måtte vite hvilke basedeklarerte metoder å ringe, og i orden. Ta en masse håndfull underklasser alle med samme cut-n-paste-kontrollstruktur, legg til 5 års vedlikehold; nå forstår du hvorfor jeg foretrekker 101 bevis Wild Turkey .
P.S. Alt dette er en stor grunn til at jeg skinner mot overbruk av interface
s i stedet for abstract
klasser.
Kommentarer
- Overforbruk av grensesnitt i C # kommer mest sannsynlig fra ikke å ønske å binde implementatoren til den spesifikke abstrakte basisklassen. Ved å bruke et grensesnitt kan implementøren implementere en annen baseklasse, og ikke bare den spesifikke abstrakte klassen. Det avhenger imidlertid mye av omstendighetene. Jeg finner en god praksis er å ha både en
IFoo
grensesnitt og enFooBase
klasse, som implementererIFoo
grensesnitt, med abstrakte metodekaller for metodene og autoegenskapene for rekvisitter. Kanskje kaste inn en ctor også.
Svar
IMO, virtual
metoder, i basisklasse, har veldig grunnleggende implementering. Selv om vi override
definisjonen av virtual
-metoden i barneklasse, kan vi fremdeles kalle virtual
-metoden (med grunnleggende implementering) mens den gir mening og ikke påvirker den tiltenkte oppførselen til overridden
-metoden i underklassen.
For eksempel BaseCalculator gjør det virkelige arbeidet. Kalkulator dekorerer BaseCalculator-biblioteket ved å utvide det.
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; } }
Sp: Hva om en overstyrt metode bare kaller basisklassen?
A: I ditt tilfelle har du baseklassemetoden som virtual
, vi trenger ikke å override
det før vi vil endre oppførselen.
Spørsmål: Er dette dårlig / god verdighet?
A: Ja, det kan være dårlig design, da det kan forstyrre kildekodefilen mens vi legger til unødvendige overstyringer.
Q: Det virker bare rart, hvorfor overstyre en metode bare for å ringe basen uansett?
A: BaseCalculator gjør det virkelige arbeidet . Kalkulator dekorerer BaseCalculator-biblioteket ved å utvide det.
Håper det hjelper!