Erkundung virtueller und abstrakter Methoden in C #

Die Programmiersprache C # unterstützt sowohl virtuelle als auch abstrakte Methoden, von denen jede unterschiedliche Vorteile hat. Sie verwenden virtuelle Methoden, um die späte Bindung zu implementieren, während abstrakte Methoden es Ihnen ermöglichen, die Unterklassen des Typs zu zwingen, die Methode explizit zu überschreiben. In diesem Beitrag werde ich eine Diskussion über virtuelle und abstrakte Methoden präsentieren und wann sie verwendet werden sollten.

Eine virtuelle Methode wird in der Basisklasse als virtuell deklariert. Eine Methode wird als virtuell deklariert, indem das Schlüsselwort "virtual" in der Methodensignatur angegeben wird. Eine virtuelle Methode kann einen Rückgabetyp haben oder nicht. Mit virtuellen Methoden können Unterklassen des Typs die Methode überschreiben. Sie werden verwendet, um Laufzeitpolymorphismus oder späte Bindung zu implementieren. Es ist zu beachten, dass virtuelle oder abstrakte Mitglieder einer Klasse nicht als privat deklariert werden können. Sie können auch eine Implementierung in einer virtuellen Methode haben, dh virtuelle Methoden können Implementierungen enthalten. Diese Implementierungen können von den Unterklassen des Typs überschrieben werden, in dem die virtuelle Methode definiert wurde.

In MSDN heißt es: "Das virtuelle Schlüsselwort wird verwendet, um eine Methode, eine Eigenschaft, einen Indexer oder eine Ereignisdeklaration zu ändern und zu ermöglichen, dass sie in einer abgeleiteten Klasse überschrieben wird."

Lassen Sie uns nun einen Code untersuchen, um besser zu verstehen, wie virtuelle Methoden verwendet werden. Siehe den folgenden Codeausschnitt.

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");

}

}

Die Test () -Methode wird in der Basisklasse als virtuell deklariert und in der abgeleiteten Klasse überschrieben. Beachten Sie, wie das Schlüsselwort virtual verwendet wird, um die Methode in der Basisklasse als virtuell zu deklarieren. Das virtuelle Schlüsselwort wird nicht benötigt, wenn Sie die virtuelle Methode in der abgeleiteten Klasse überschreiben.

Lesen Sie nun das nächste Code-Snippet, das zeigt, wie virtuelle Methoden aufgerufen werden.

class Program

{

static void Main()

{

Base baseObj1 = new Base();

baseObj1.Test();

Base baseObj2 = new Derived();

baseObj2.Test();

}

}

Beachten Sie, dass zwei Instanzen der Basisklasse erstellt werden - baseObj1 und baseObj2. Im ersten Fall verweist das Referenzobjekt mit dem Namen baseObj1 auf eine Instanz der Basisklasse. Im zweiten Fall bezieht sich das Referenzobjekt mit dem Namen baseObj2 auf eine Instanz der Klasse Derived. Wenn Sie den Code ausführen, wird beim ersten Aufruf der virtuellen Methode die Meldung "Dies ist die Basisversion der virtuellen Methode" in der Konsole angezeigt. Im zweiten Fall wird die Meldung "Dies ist die abgeleitete Version der virtuellen Methode" angezeigt. Warum dieser Unterschied?

Im ersten Fall wird der Typ des Referenzobjekts baseObj1 berücksichtigt. Da es sich um den Basistyp handelt, wird die Basisversion der virtuellen Methode aufgerufen. Im zweiten Fall wird der Kontext des Referenzobjekts baseObj2 und damit das Ergebnis berücksichtigt.

Abstrakte Methoden sind solche, die in der Basisklasse als abstrakt deklariert sind und keine Implementierungen enthalten können, dh sie können keine Funktionalität enthalten. Sie können abstrakte Methoden verwenden, wenn die Methode in den abgeleiteten Klassen des Typs, in dem die abstrakte Methode definiert wurde, zwangsweise überschrieben werden soll. Dies wird zur Kompilierungszeit vom Compiler erzwungen. Wenn Sie also eine Methode mit dem Modifikator abstract in einer Basisklasse als abstrakt deklariert haben, müssen die Unterklassen dieser Klasse die abstrakte Methode implementieren, bei der der Compiler einen Fehler anzeigt, der besagt, dass die abgeleitete Klasse die Zusammenfassung nicht implementiert hat Mitglied. Im Wesentlichen,Eine abstrakte Methode wird mit dem Schlüsselwort abstract in einer abstrakten Basisklasse deklariert, und nicht abstrakte Unterklassen dieses Typs müssen eine eigene Implementierung der abstrakten Methode haben. Abstrakte Methoden sind ebenfalls implizit virtueller Natur, aber Sie können das virtuelle Schlüsselwort nicht verwenden, wenn Sie eine abstrakte Methode deklarieren. Es ist zu beachten, dass abstrakte Methoden nur innerhalb abstrakter Klassen deklariert werden können.

Eine typische Verwendung einer abstrakten Methode besteht darin, das Überschreiben der Methoden ToString () oder Equals () zu erzwingen. Das folgende Codeausschnitt zeigt, wie abstrakte Methoden in einer abstrakten Klasse namens EntityBase deklariert werden.

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

}

Die EntityBase-Klasse ist der Basistyp für alle Entitäten. Die Entitätsklasse Customer erweitert diese Klasse und stellt die Implementierung für die abstrakten Methoden bereit. Im Wesentlichen würden alle Entitätsklassen ihre eigene Implementierung der Methoden ToString () und Equals () bereitstellen. Für diese Methoden ist in der Basisklasse keine Standardimplementierung erforderlich, daher werden sie als abstrakt markiert. Das Überschreiben von Methoden wird also erzwungen, indem die Methode in der Basisklasse mit dem Namen EntityBase als abstrakt deklariert wird.