Eksplorowanie metod wirtualnych i abstrakcyjnych w C #

Język programowania C # zapewnia obsługę zarówno metod wirtualnych, jak i abstrakcyjnych, z których każda ma inne zalety. Używasz metod wirtualnych do implementowania późnego wiązania, podczas gdy metody abstrakcyjne umożliwiają wymuszenie jawnego zastąpienia metody podklas typu. W tym poście przedstawię dyskusję na temat zarówno metod wirtualnych, jak i abstrakcyjnych oraz tego, kiedy należy ich używać.

Metoda wirtualna to taka, która jest zadeklarowana jako wirtualna w klasie bazowej. Metoda jest deklarowana jako wirtualna poprzez określenie słowa kluczowego „virtual” w sygnaturze metody. Metoda wirtualna może mieć typ zwracany lub nie. Metody wirtualne umożliwiają podklasom typu przesłanianie metody. Służą do implementacji polimorfizmu w czasie wykonywania lub późnego wiązania. Należy zauważyć, że wirtualnych lub abstrakcyjnych członków klasy nie można zadeklarować jako prywatnych. Możesz również mieć implementację w metodzie wirtualnej, tj. Metody wirtualne mogą mieć implementacje w sobie. Te implementacje mogą zostać przesłonięte przez podklasy typu, w którym zdefiniowano metodę wirtualną.

Stany MSDN: „Słowo kluczowe virtual służy do modyfikowania metody, właściwości, indeksatora lub deklaracji zdarzenia i umożliwia przesłonięcie ich w klasie pochodnej”.

Zagłębmy się teraz w kod, aby uzyskać lepszą jasność na temat wykorzystania metod wirtualnych. Zapoznaj się z fragmentem kodu poniżej.

public class Base

{

public virtual void Test()

{

Console.WriteLine("This is the base version of the virtual method");

}

}

public class Derived : Base

{

public override void Test()

{

Console.WriteLine("This is the derived version of the virtual method");

}

}

Metoda Test () jest zadeklarowana jako wirtualna w klasie Base i jest zastępowana w klasie pochodnej. Zwróć uwagę, jak słowo kluczowe virtual jest używane do zadeklarowania metody jako wirtualnej w klasie Base. Słowo kluczowe virtual nie jest potrzebne, gdy zastępujesz metodę wirtualną w klasie pochodnej.

Teraz zapoznaj się z fragmentem kodu podanym poniżej, który ilustruje, jak wywoływane są metody wirtualne.

class Program

{

static void Main()

{

Base baseObj1 = new Base();

baseObj1.Test();

Base baseObj2 = new Derived();

baseObj2.Test();

}

}

Zwróć uwagę, że tworzone są dwie instancje klasy Base - baseObj1 i baseObj2. W pierwszym przypadku obiekt referencyjny o nazwie baseObj1 odwołuje się do instancji klasy Base. W drugim przypadku obiekt odniesienia o nazwie baseObj2 odwołuje się do wystąpienia klasy pochodnej. Podczas wykonywania kodu pierwsze wywołanie metody wirtualnej spowoduje wyświetlenie w konsoli komunikatu „To jest podstawowa wersja metody wirtualnej”. W drugim przypadku zostanie wyświetlony komunikat „To jest wyprowadzona wersja metody wirtualnej”. Skąd ta różnica?

W pierwszym przypadku brany jest pod uwagę typ obiektu referencyjnego baseObj1 - ponieważ jest to typ Base, zostanie wywołana podstawowa wersja metody wirtualnej. W drugim przypadku zostanie uwzględniony kontekst obiektu referencyjnego baseObj2, a tym samym wynik.

Metody abstrakcyjne to takie, które są zadeklarowane jako abstrakcyjne w klasie bazowej i nie mogą mieć w sobie implementacji, tj. Nie mogą mieć w sobie żadnej funkcjonalności. Możesz użyć metod abstrakcyjnych, gdy chcesz, aby metoda została wymuszona w klasach pochodnych typu, w którym metoda abstrakcyjna została zdefiniowana. Jest to wymuszane w czasie kompilacji przez kompilator. Tak więc, jeśli zadeklarowałeś metodę jako abstrakcyjną przy użyciu modyfikatora abstrakcyjnego w klasie bazowej, podklasy tej klasy musiałyby zaimplementować metodę abstrakcyjną, która zakończy się niepowodzeniem, co spowoduje wyświetlenie przez kompilator błędu stwierdzającego, że klasa pochodna nie zaimplementowała abstrakcji członek. W istociemetoda abstrakcyjna jest deklarowana przy użyciu słowa kluczowego abstract w abstrakcyjnej klasie bazowej, a nieabstrakcyjne podklasy tego typu muszą mieć własną implementację metody abstrakcyjnej. Metody abstrakcyjne również mają niejawnie wirtualny charakter, ale nie można używać słowa kluczowego virtual podczas deklarowania metody abstrakcyjnej. Należy zauważyć, że metody abstrakcyjne można deklarować tylko wewnątrz klas abstrakcyjnych.

Typowym zastosowaniem metody abstrakcyjnej jest wymuszenie przesłaniania metod ToString () lub Equals (). Poniższy fragment kodu ilustruje, jak metody abstrakcyjne są deklarowane w klasie abstrakcyjnej o nazwie EntityBase.

public abstract class EntityBase

{

public abstract override string ToString();

public abstract override bool Equals(object obj);

}

public class Customer : EntityBase

{

//Implementation code for the abstract methods

}

Klasa EntityBase jest typem podstawowym dla wszystkich jednostek - klasa jednostki Customer rozszerza tę klasę i zapewnia implementację metod abstrakcyjnych. Zasadniczo wszystkie klasy jednostek zapewniłyby własną implementację metod ToString () i Equals (). Żadna domyślna implementacja tych metod nie jest wymagana w klasie bazowej, dlatego są one oznaczone jako abstrakcyjne. Zatem przesłanianie metody jest wymuszane przez zadeklarowanie metody jako abstrakcyjnej w klasie bazowej o nazwie EntityBase.