Podstawa wywołania wewnątrz metody zastępowanej

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 klasy FooBase, 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!

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *