Tudom, hogy vannak kérdések az alap módszer meghívásával egy felülbírált módszeren belül, például ezt . De mi van akkor, ha egy felülbírált módszer csak az alaposztályt hívja meg? Ez rossz / jó becsület? Csak furcsának tűnik, miért írjuk felül a metódust, hogy mégis meghívjuk a bázist?
Például lásd:
public class BaseClass { virtual public void Method1() { //Do stuff } } public class InheritingClass : BaseClass { override public void Method1() { base.Method1(); } }
Megjegyzések
- Nincs célja, és csak összezavarja a kódot, ezért szabaduljon meg tőle.
- @DavidArno, hogy ' s amire én is gondoltam, csak megbizonyosodtam róla, hogy ' nincs oka ennek, mielőtt megtettem
- Egy ideális világban az alkalmazást lefedik egység tesztek, így eltávolíthatja, és amikor a tesztek még mindig sikeresek voltak, ' tudta, hogy nincs rá szükség '. Azért nem ' mindig élünk abban az ideális világban, ezért ésszerű volt megkérdezni 🙂
- Az egyetlen ok, amiért <
hagyja a kódot úgy néz ki, mint a fentiek, ha korábban több kód volt az felülbírált módszerben, és eltávolították, de a forrásvezérlő rendszer régi verzióin keresztül megtekinthető volt. Ha az aktuális kódban így hagy egy műterméket, jelezheti a mai fejlesztőnek, hogy megtekinthesse a módszer előző verziójának ' fájljának előzményeit.
Válasz
De mi van akkor, ha egy felülbírált módszer csak az alaposztályt hívja meg? Ez rossz / jó design?
Rossz tervezés ? Nem, meglehetősen rossz végrehajtás. Ez félrevezető a karbantartó programozó számára. Ha nem látok felülírást, akkor tudom az alapot hívják. Egy felülbírálás azt mondja nekem, hogy van valami más, még akkor is, ha a bázist oda is behívják.
A felülírás megkövetelése az alap sablon nélküli hívásához rossz tervezés
Hivatkozott szál – a legnépszerűbb válaszadó
A kezdeti reakcióm a skandináv felülírásra model is: HORRÓ KÓDOLÁSA! Úgy tűnik, kénytelen vagyok elolvasni mindezt, majd még többet, hogy megbizonyosodjak arról, hogy az “al-viselkedés” nem sérti-e a kódomat, és fordítva.
A Template Method Pattern jó módszer a változó kód kifejezésére egy nagyobb kódfolyamaton belül és a helyes végrehajtási sorrend biztosítása.
Tapasztalataim szerint annyira jellemző, hogy egy alosztálynak tudnia kell milyen alap-deklarált módszereket hívjon és sorrendben. Vegyünk egy halom maroknyi alosztályt, ugyanazzal a cut-n-paste kontroll struktúrával, adjunk hozzá 5 év karbantartást; most már megértette, miért választom a 101 proof Wild Turkey -t.
P.S. Mindez egy nagy oka annak, hogy a interface
ek túlzott használata ellen abstract
osztályok helyett
Megjegyzések
- Az interfészek túlzott használata a C # -ben valószínűleg abból adódik, hogy nem akarja a végrehajtót az adott absztrakt alaposztályhoz kötni. Az interfész használata lehetővé teszi a megvalósító számára, hogy egy másik alaposztályt valósítson meg, és ne csak az adott absztrakt osztályt. Nagyon függ ez a körülményektől. Jó gyakorlatnak tartom, ha van egy
IFoo
interfész és egyFooBase
osztály, amely aIFoo
interfész, elvont metódus-hívásokkal a kellékek metódusaira és automatikus tulajdonságaira. Lehet, hogy dob egy ctorot is.
Válasz
IMO, virtual
módszerek az alaposztályban nagyon alapvető megvalósításúak. Még akkor is, ha override
meghatározzuk a virtual
metódust a gyermekosztályban, akkor is hívhatjuk a div> módszer (alapvető megvalósítással), bár van értelme, és nem befolyásolja a overridden
módszer rendelt viselkedését a gyermekosztályban.
Például a BaseCalculator elvégzi az igazi munkát. A Számológép kibővíti a BaseCalculator könyvtárat.
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; } }
K: Mi van, ha egy felülbírált módszer csak az alaposztályt hívja meg?
A: Az Ön esetében az alaposztályú metódus virtual
, addig nem kell override
addig dolgozni, amíg meg nem akarjuk változtatni a viselkedését.
K: Ez rossz / jó becsület?
A: Igen, rosszul lehetne megtervezni, mert megzavarhatja a forráskód fájlt, miközben felesleges felülírásokat adunk hozzá.
K: Csak furcsának tűnik. Miért is írhatná felül a metódust csak azért, hogy felhívja a bázist?
A: A BaseCalculator elvégzi a valódi munkát . A Számológép kibővíti a BaseCalculator könyvtárat.
Remélem, segít!