Ik weet dat er vragen zijn over het aanroepen van de basismethode binnen een overschreven methode zoals dit . Maar wat als een overschreven methode alleen de basisklasse aanroept? Is dit slecht / goed verwaardigd? Het lijkt gewoon vreemd, waarom zou je een methode overschrijven om toch maar de basis te bellen?
Zie bijvoorbeeld:
public class BaseClass { virtual public void Method1() { //Do stuff } } public class InheritingClass : BaseClass { override public void Method1() { base.Method1(); } }
Reacties
- Het dient geen doel en maakt de code alleen maar onoverzichtelijk, dus verwijder deze.
- @DavidArno dat ' dacht ik ook, ik zorg ervoor dat er geen ' een reden voor was voordat ik dat deed
- In een ideale wereld valt de app onder unit tests, dus je zou het kunnen verwijderen, en als alle tests nog steeds geslaagd waren, ' wist je dat het niet ' t nodig was. We ' leven echter niet altijd in die ideale wereld, dus het was verstandig om te vragen 🙂
- De enige reden waarom ik ' d laat de code eruitzien zoals hierboven zou zijn als er in het verleden meer code in de overschreven methode was, en deze was verwijderd, maar kon worden bekeken via oude versies in het broncontrolesysteem. Door een artefact in de huidige code achter te laten, zou dit aan de ontwikkelaar kunnen signaleren dat hij de ' geschiedenis van het bestand voor de vorige versie van de methode moet bekijken.
Answer
Maar wat als een overschreven methode alleen de basisklasse aanroept? Is dit een slecht / goed ontwerp?
Slecht ontwerp ? Nee, nogal slechte implementatie. Het is misleidend voor de onderhoudsprogrammeur. Als ik geen override zie, weet dat de basis wordt gebeld. Een override vertelt me dat er iets anders is, zelfs als de basis daar ook wordt opgeroepen.
Een overschrijving vereisen om de basis aan te roepen zonder sjabloon is slecht ontwerp
Discussie waarnaar wordt verwezen – meest populaire antwoord
Mijn eerste reactie op de Scandinavische overschrijving model is: CODING HORROR! Het lijkt erop dat ik gedwongen ben dat allemaal te lezen, en dan nog meer, om ervoor te zorgen dat het “subgedrag” mijn code niet breekt en vice versa.
De Template Method Pattern is een goede manier om variabele code uit te drukken binnen een grotere codestroom en te zorgen voor een correcte uitvoeringsvolgorde.
In mijn ervaring is het zo typisch dat een subklasse moet weten welke door de base gedeclareerde methoden moeten worden aangeroepen en in volgorde Neem een handvol subklassen allemaal met dezelfde cut-n-paste controlestructuur, voeg 5 jaar onderhoud toe; nu begrijp je waarom ik de voorkeur geef aan 101 proof Wild Turkey .
P.S. Dat alles is een belangrijke reden waarom ik bezwaar maak tegen het overmatig gebruik van interface
s in plaats van abstract
klassen.
Reacties
- Het overmatig gebruik van interfaces in C # komt waarschijnlijk doordat je de implementator niet aan die specifieke abstracte basisklasse wil binden. Door een interface te gebruiken, kan de implementator een andere basisklasse implementeren, en niet alleen die specifieke abstracte klasse. Het hangt echter sterk af van de omstandigheden. Ik vind dat het een goede gewoonte is om zowel een
IFoo
-interface als eenFooBase
-klasse te hebben, die deIFoo
interface, met abstracte methode-oproepen voor de methoden en auto-eigenschappen voor de rekwisieten. Gooi er misschien ook een ctor in.
Antwoord
IMO, virtual
-methoden, in de basisklasse, hebben een zeer eenvoudige implementatie. Zelfs als we override
de definitie van de virtual
-methode in de onderliggende klasse gebruiken, kunnen we nog steeds de virtual
-methode (met basisimplementatie) terwijl het logisch is en geen invloed heeft op het beoogde gedrag van de overridden
-methode in de kindklasse.
Bijvoorbeeld BaseCalculator doet het echte werk. Rekenmachine versiert de BaseCalculator-bibliotheek door deze uit te breiden.
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; } }
Vraag: Wat als een overschreven methode alleen de basisklasse aanroept?
A: In jouw geval is de basisklassemethode virtual
, we hoeven het niet override
te override
totdat we het gedrag willen veranderen.
V: Is dit slecht / goed verwaardigd?
A: Ja, het kan een slecht ontwerp zijn, aangezien het broncodebestand onoverzichtelijk kan worden terwijl we onnodige overschrijvingen toevoegen.
V: Het lijkt gewoon vreemd, waarom zou je een methode negeren om de basis toch te bellen?
A: BaseCalculator doet het echte werk . Calculator versiert de BaseCalculator-bibliotheek door deze uit te breiden.
Hoop, het helpt!