Inna twórczość > Platforma .NET
Różnica pomiędzy Abstract a Virtual
(1/1)
Sawik:
Ostatnio znajduję coraz więcej wolnego czasu dlatego powoli wracam do programowania żeby go sobie czymś wypełnić.
Generalnie do tej pory jak muł bawiłem się w pisanie tysięcy wyjątków i wielokrotne edytowanie kodu z przed paru miesięcy w celu dodania kolejnego wyjątku, w większości wypadków powinny pomóc mi metody virtual/abstract, jednak mam lekki problem z wyobrażeniem sobie sytuacji w której kiedykolwiek chciałbym użyć abstract.
Załóżmy że mam dwie klasy:
Wersja virtual
--- Kod: ---public class BaseClass
{
public void SayHello()
{
print("Hello");
}
public void SayGoodbye ()
{
print("Goodbye");
}
}
public class DerivedClass : BaseClass
{
public new void SayHello()
{
print("Hi There");
}
public new void SayGoodbye()
{
base.SayGoodbye();
EndProgram(); // Raczej oczywiste, ale - metoda kończąca program
}
}
--- Koniec kodu ---
wersja abstract
--- Kod: ---public abstract class BaseClass
{
public void SayHello()
{
print("Hello");
}
public abstract void SayGoodbye ();
}
public class DerivedClass : BaseClass
{
public new void SayHello()
{
print("Hi There");
}
public override void SayGoodbye()
{
print("Goodbye");
}
}
--- Koniec kodu ---
Nie rozumiem dlaczego chciałbym pozbawiać się podstawowej definicji metody biorąc pod uwagę fakt że używając virtual otrzymuję to samo, jednocześnie zachowując możliwość wywołania wersji bazowej, czyli nie muszę pisać części wspólnych ponownie. Jeżeli klasy dziedziczące nie miałyby cech wspólnych dlaczego chciałbym tę metodę deklarować w klasie podstawowej?
inż. Avallach:
Abstract używasz wtedy kiedy tworzysz klasę która nie jest gotowa do użycia - bo na przykład jej fragment będzie musiał występować w wielu wariantach, implementowanych w klasach dziedziczących z tej.
Zostawienie zamiast tego pustej nie-abstrakcyjnej metody byłoby strasznym błędem, bo ktoś mógłby takiej klasy użyć nie wiedząc że nie spełnia ona kontraktu który deklaruje nagłówkami swoich metod. Użycie słowa kluczowego abstract zapobiega tej sytuacji, bo uniemożliwia zinstancjonowanie obiektu czysto tej klasy.
Sawik:
Czyli jest to tylko i wyłącznie zabezpieczenie, w żadnych innych różnic nie ma? Oczywiście poza dwoma faktami, klasy abstract nie mogę zinstancjować natomiast metoda abstract nie może posiadać ciała.
Adanos:
Klasę abstrakcyjną tworzysz wtedy, gdy masz pewną rodzinę obiektów. Obiekty te należą do jakiejś hierarchii, są podobne, ale mają różnice. Weźmy na przykład figury geometryczne. Każda figura ma jakieś pole i obwód. Czy jesteś w stanie zdefiniować wzory dla obiektu figura? Nie. A dla kwadratu i prostokąta? Tak. Jeśli masz metodę abstrakcyjną, to dzięki temu możesz wywołać na wszystkich obiektach typu kwadrat oraz prostokąt metodę oblicz pole, mimo że ich implementacja będzie inna.
Po co metody wirtualne? Może się okazać, że w większości przypadków metoda z klasy bazowej nadaje się dla obiektów z klas pochodnych. Jeśli okaże się, że w klasie pochodnej należy zmienić metodę, to zmienisz ją tylko w klasie pochodnej, w pozostałych klasach będzie wywoływana metoda z klasy bazowej.
Nawigacja
Idź do wersji pełnej