Wirtualny kontra streszczenie
Virtual i Abstract to dwa słowa kluczowe używane w większości języków programowania obiektowego (OO), takich jak Java i C #. Chociaż istnieją niewielkie różnice w znaczeniu tego słowa w różnych językach, zarówno słowa wirtualne, jak i abstrakcyjne dają poczucie częściowej implementacji podmiotów, do których dołączają.
Abstrakcyjny
Zazwyczaj klasy abstrakcyjne, znane również jako abstrakcyjne klasy podstawowe (ABC), nie mogą być tworzone (nie można utworzyć instancji tej klasy). Tak więc klasy abstrakcyjne mają sens tylko wtedy, gdy język programowania obsługuje dziedziczenie (możliwość tworzenia podklas po rozszerzeniu klasy). Klasy abstrakcyjne zwykle reprezentują abstrakcyjne pojęcie lub encję z częściową implementacją lub bez jej implementacji. Dlatego klasy abstrakcyjne działają jako klasy nadrzędne, z których wywodzą się klasy podrzędne, dzięki czemu klasa podrzędna będzie dzielić niekompletne funkcje klasy nadrzędnej i można je dodać, aby je uzupełnić. Klasy abstrakcyjne mogą zawierać metody abstrakcyjne. Podklasy rozszerzające klasę abstrakcyjną mogą implementować te (odziedziczone) metody abstrakcyjne. Jeśli klasa potomna implementuje wszystkie takie metody abstrakcyjne, jest to klasa konkretna. Ale jeśli nie, klasa potomna staje się również klasą abstrakcyjną. Oznacza to, że gdy programista nominuje klasę jako streszczenie, mówi, że klasa będzie niekompletna i będzie zawierała elementy, które muszą zostać uzupełnione przez dziedziczące podklasy. To dobry sposób na zawarcie umowy między dwoma programistami, która upraszcza zadania związane z tworzeniem oprogramowania. Programista, który pisze kod do dziedziczenia, musi dokładnie przestrzegać definicji metod (ale oczywiście może mieć własną implementację). W Javie i C # klasy i metody Abstract są deklarowane przy użyciu słowa kluczowego Abstract.
Wirtualny
Wirtualne metody / funkcje zapewniają możliwość opcjonalnego zastąpienia jego zachowania przez dziedziczącą klasę (za pomocą funkcji o tej samej sygnaturze). Pojęcie funkcji wirtualnej jest ważne w następującym scenariuszu. Załóżmy, że klasa jest pochodną klasy podrzędnej, a następnie za każdym razem, gdy używany jest obiekt klasy pochodnej, może odnosić się do obiektu klasy podstawowej lub klasy pochodnej. Ale zachowanie wywołania metody może być niejednoznaczne, jeśli zostaną zastąpione metody klasy bazowej. Tak więc, aby rozwiązać tę dwuznaczność, używane jest Wirtualne słowo kluczowe. Jeśli metoda jest oznaczona jako Wirtualna, wówczas wywoływana jest funkcja klasy pochodnej (jeśli istnieje) lub też wywoływana jest funkcja klasy bazowej. Na przykład w C ++ słowo kluczowe Virtual służy właśnie do tego celu. W języku C # słowo kluczowe Virtual jest używane w podobny sposób, ale dodatkowo należy zastąpić słowo kluczowe, aby zmodyfikować wszystkie zastąpione metody. Ale w Javie nie ma wyraźnego wirtualnego słowa kluczowego. Wszystkie metody niestatyczne są uważane za wirtualne. Funkcje wirtualne bez ciała nazywane są funkcjami Pure Virtual. W Javie i C # metody abstrakcyjne są w rzeczywistości Pure Virtual.
Różnica między wirtualną a abstrakcyjną
Chociaż Abstract i Virtual są dwoma słowami kluczowymi / pojęciami, które nadają znaczenie niepełnej implementacji powiązanym z nimi jednostkom, mają jednak swoje różnice. Metody abstrakcyjne (które muszą być zdefiniowane w klasach abstrakcyjnych) w ogóle nie mają implementacji, podczas gdy metody wirtualne mogą mieć implementację. Jeśli metody abstrakcyjne zostaną rozszerzone o konkretną klasę, wszystkie odziedziczone metody abstrakcyjne muszą zostać zaimplementowane, podczas gdy odziedziczone metody wirtualne mogą zostać zastąpione lub nie.