Wiem, że są pytania dotyczące wywoływania metody podstawowej w ramach metody zastępowanej, takiej jak to . Ale co, jeśli przesłonięta metoda wywołuje tylko klasę bazową? Czy to źle / dobrze raczy? To po prostu wydaje się dziwne, po co i tak nadpisywać metodę tylko po to, aby wywołać bazę?
Na przykład zobacz:
public class BaseClass { virtual public void Method1() { //Do stuff } } public class InheritingClass : BaseClass { override public void Method1() { base.Method1(); } }
Komentarze
- Nie służy to żadnemu celowi i po prostu zaśmieca kod, więc się go pozbądź.
- @DavidArno that ' tak też myślałem, po prostu upewniając się, że nie ma ' powodu, dla którego to zrobiłem, zanim to zrobiłem
- W idealnym świecie aplikacja będzie objęta testy jednostkowe, więc możesz je usunąć, a kiedy wszystkie testy nadal kończą się powodzeniem, ' nie wiedziałeś, że nie było ' nie potrzebne. Jednak ' nie zawsze żyjemy w tym idealnym świecie, więc rozsądnie było zapytać 🙂
- Jedyny powód, dla którego ' d pozostaw kod wyglądający jak powyższy, gdyby w przeszłości było więcej kodu w nadpisanej metodzie i został on usunięty, ale można go było przeglądać przez stare wersje w systemie kontroli źródła. Pozostawienie takiego artefaktu w bieżącym kodzie, jak ten, może sygnalizować deweloperowi dzisiaj, że powinien wyświetlić historię pliku ' dla poprzedniej wersji metody.
Odpowiedź
Ale co, jeśli zastąpiona metoda wywołuje tylko klasę bazową? Czy to zły / dobry projekt?
Zły projekt ? Nie, raczej zła realizacja. Jest to mylące dla programisty konserwacyjnego. Kiedy nie widzę nadpisania, wiem , że wywoływana jest baza. Zastąpienie mówi mi, że jest coś innego, nawet jeśli baza jest tam również wywoływana.
Wymaganie zastąpienia w celu wywołania bazy bez szablonu to zły projekt
Wątek z odniesieniem – najpopularniejsza odpowiedź
Moja początkowa reakcja na skandynawską zmianę model to: CODING HORROR! Wygląda na to, że jestem zmuszony przeczytać to wszystko, a potem jeszcze więcej, aby upewnić się, że „zachowanie podrzędne” nie uszkodzi mojego kodu i na odwrót.
Wzorzec metody szablonu to dobry sposób na wyrażenie kodu zmiennej w ramach większego przepływu kodu i zapewnienie prawidłowej kolejności wykonywania.
Z mojego doświadczenia wynika, że podklasa musi wiedzieć, jakie metody zadeklarowane w bazie mają wywołać i w jakiej kolejności. Weź garść podklas, wszystkie z tą samą strukturą sterowania wytnij i wklej, dodaj 5 lat konserwacji; teraz rozumiesz, dlaczego wolę 101 dowodów dzikiego indyka .
P.S. Wszystko to jest jednym z głównych powodów, dla których przeciwstawiam się nadużywaniu interface
zamiast klas abstract
.
Komentarze
- Nadużywanie interfejsów w C # najprawdopodobniej wynika z braku chęci przypięcia implementatora do tej konkretnej abstrakcyjnej klasy bazowej. Użycie interfejsu umożliwia implementującemu implementację innej klasy bazowej, a nie tylko tej konkretnej klasy abstrakcyjnej. Zależy to jednak w dużej mierze od okoliczności. Uważam, że dobrą praktyką jest posiadanie zarówno interfejsu
IFoo
, jak i klasyFooBase
, które implementująIFoo
interfejs, z abstrakcyjnymi wywołaniami metod dla metod i auto-właściwościami dla właściwości. Może też dorzucić ctora.
Odpowiedź
IMO, virtual
w klasie bazowej mają bardzo podstawową implementację. Nawet jeśli override
definicję metody virtual
w klasie podrzędnej, nadal możemy wywołać virtual
(z podstawową implementacją), chociaż ma sens i nie wpływa na zamierzone zachowanie metody overridden
w klasie potomnej.
Na przykład BaseCalculator wykonuje prawdziwą pracę. Kalkulator ozdabia bibliotekę BaseCalculator, rozszerzając ją.
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; } }
P: Co się stanie, jeśli zastąpiona metoda wywoła tylko klasę bazową?
A: W twoim przypadku, mając metodę klasy bazowej jako virtual
, nie musimy go override
, dopóki nie będziemy chcieli zmienić jego zachowania.
P: Czy to źle / dobrze raczysz?
A: Tak, może to źle zaprojektować, ponieważ może zaśmiecać plik kodu źródłowego podczas dodawania niepotrzebnych nadpisań.
P: Po prostu wydaje się dziwne, po co i tak zastępować metodę tylko po to, aby wywołać bazę?
A: BaseCalculator wykonuje prawdziwą pracę . Kalkulator ozdabia bibliotekę BaseCalculator, rozszerzając ją.
Mam nadzieję, że to pomaga!