Vím, že existují otázky týkající se volání základní metody uvnitř přepsané metody, jako je toto . Ale co když přepsaná metoda volá pouze základní třídu? Je to špatný / dobrý design? Vypadá to divně, proč přepsat metodu, která přesto volá základnu?
Například:
public class BaseClass { virtual public void Method1() { //Do stuff } } public class InheritingClass : BaseClass { override public void Method1() { base.Method1(); } }
Komentáře
- Neslouží to žádnému účelu a kód prostě zaplníte, takže se ho zbavte.
- @DavidArno, že ' s tím, co jsem si také myslel, jen se ujistit, že na to nebyl ' ten důvod, než jsem to udělal
- V ideálním světě bude aplikace pokryta jednotkové testy, takže byste je mohli odebrat, a když všechny testy stále proběhly, ' víte, že to nebylo ' potřeba. Nežijeme ' vždy v tomto ideálním světě, takže bylo rozumné se ptát 🙂
- Jediný důvod, proč jsem ' Nechat kód vypadat, jako by to bylo výše, pokud by v minulosti byla v přepsané metodě více kódu a byl odstraněn, ale mohl by být zobrazen prostřednictvím starých verzí v systému ovládání zdroje. Ponechání takového artefaktu v aktuálním kódu by dnes mohlo signalizovat vývojáři, aby si mohli prohlédnout historii souboru ' pro předchozí verzi metody.
Odpověď
Ale co když přepsaná metoda volá pouze základní třídu? Je to špatný / dobrý design?
Špatný design ? Ne, spíše špatná implementace. Pro programátora údržby je to zavádějící. Když nevidím přepsání, vím základna se volá. Přepsání mi říká, že existuje něco jiného, i když je tam zavolána také základna.
Vyžadování přepsání volání základny bez šablony je špatný design
Odkazované vlákno – nejoblíbenější answser
Moje počáteční reakce na skandinávské přepsání model is: CODING HORROR! Vypadá to, že jsem nucen si to všechno přečíst a ještě víc, abych se ujistil, že „sub-chování“ neporušuje můj kód a naopak.
Šablona metody šablony je dobrý způsob, jak vyjádřit variabilní kód v rámci většího toku kódu a zajistit správné pořadí provádění.
Podle mých zkušeností je to pro podtřídu tak typické jaké základní deklarované metody volat, a v pořadí. Vezměte hromadu podtříd všech se stejnou řídicí strukturou cut-n-paste, přidejte 5 let údržby; Nyní chápete, proč dávám přednost 101 proof Divokému Turecku .
P.S. To je jeden velký důvod, proč se snažím bránit nadužívání interface
s namísto abstract
tříd.
Komentáře
- Nadměrné používání rozhraní v C # s největší pravděpodobností pochází z toho, že jsme nechtěli zavést implementátor do konkrétní abstraktní základní třídy. Použití rozhraní umožňuje implementátorovi implementovat další základní třídu, nejen tu specifickou abstraktní třídu. Záleží to hodně na okolnostech. Dobrou praxí je mít rozhraní
IFoo
a tříduFooBase
, která implementujeIFoo
rozhraní s abstraktními voláními metod pro metody a automatickými vlastnostmi pro rekvizity. Možná hodíte také ctor.
Odpovědět
IMO, virtual
metody v základní třídě mají velmi základní implementaci. I když override
definici metody virtual
v podřízené třídě můžeme stále volat virtual
(se základní implementací), i když má smysl a neovlivňuje zamýšlené chování metody overridden
v podřízené třídě.
Například BaseCalculator dělá skutečnou práci. Kalkulačka zdobí knihovnu BaseCalculator rozšířením.
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; } }
Otázka: Co když přepsaná metoda volá pouze základní třídu?
A: Ve vašem případě mít metodu základní třídy jako virtual
, override
to nemusíme, dokud nebudeme chtít změnit jeho chování.
Otázka: Je to špatný / dobrý design?
A: Ano, může to být špatný design, protože může zaplnit soubor zdrojového kódu, zatímco přidáváme zbytečné přepisy.
Otázka: Jen se to zdá divné, proč přepsat metodu jen tak, abychom zavolali základnu?
A: BaseCalculator dělá skutečnou práci . Kalkulačka zdobí knihovnu BaseCalculator rozšířením.
Doufám, že to pomůže!