Virtuele en abstracte methoden verkennen in C #

De programmeertaal C # biedt ondersteuning voor zowel virtuele als abstracte methoden, die elk hun eigen voordelen hebben. U gebruikt virtuele methoden om late binding te implementeren, terwijl u met abstracte methoden de subklassen van het type kunt afdwingen om de methode expliciet te laten overschrijven. In dit bericht zal ik een discussie presenteren over zowel virtuele als abstracte methoden en wanneer ze moeten worden gebruikt.

Een virtuele methode is een methode die als virtueel wordt gedeclareerd in de basisklasse. Een methode wordt als virtueel gedeclareerd door het sleutelwoord "virtual" in de methodehandtekening op te geven. Een virtuele methode kan al dan niet een retourtype hebben. Met virtuele methoden kunnen subklassen van het type de methode overschrijven. Ze worden gebruikt om run-time polymorfisme of late binding te implementeren. Opgemerkt moet worden dat virtuele of abstracte leden van een klasse niet als privé kunnen worden aangemerkt. U kunt ook een implementatie in een virtuele methode hebben, dwz virtuele methoden kunnen implementaties in zich hebben. Deze implementaties kunnen worden overschreven door de subklassen van het type waarin de virtuele methode is gedefinieerd.

MSDN stelt: "Het virtuele sleutelwoord wordt gebruikt om een ​​methode, eigenschap, indexeerfunctie of gebeurtenisdeclaratie te wijzigen en toe te staan ​​dat deze in een afgeleide klasse wordt overschreven."

Laten we nu wat code verdiepen voor meer duidelijkheid over hoe virtuele methoden worden gebruikt. Raadpleeg het onderstaande codefragment.

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

}

}

De methode Test () wordt gedeclareerd als virtueel in de klasse Base en wordt overschreven in de klasse Derived. Merk op hoe het virtuele sleutelwoord wordt gebruikt om de methode als virtueel te declareren in de klasse Base. Het virtuele sleutelwoord is niet nodig als u de virtuele methode in de klasse Derived overschrijft.

Raadpleeg nu het volgende codefragment dat illustreert hoe virtuele methoden worden aangeroepen.

class Program

{

static void Main()

{

Base baseObj1 = new Base();

baseObj1.Test();

Base baseObj2 = new Derived();

baseObj2.Test();

}

}

Merk op dat er twee instanties van de klasse Base worden gemaakt: baseObj1 en baseObj2. In het eerste geval verwijst het referentieobject met de naam baseObj1 naar een instantie van de klasse Base. In het tweede geval verwijst het referentieobject met de naam baseObj2 naar een instantie van de klasse Derived. Wanneer u de code uitvoert, zou de eerste aanroep van de virtuele methode het bericht "Dit is de basisversie van de virtuele methode" in de console weergeven. In het tweede geval zou het bericht "Dit is de afgeleide versie van de virtuele methode" worden weergegeven. Waarom dit verschil?

In het eerste geval wordt het type referentieobject baseObj1 in aanmerking genomen - aangezien het van het basistype is, wordt de basisversie van de virtuele methode aangeroepen. In het tweede geval wordt de context van het referentieobject baseObj2 in overweging genomen en daarmee het resultaat.

Abstracte methoden zijn methoden die abstract worden verklaard in de basisklasse en die geen implementaties kunnen bevatten, dwz ze kunnen geen enkele functionaliteit bevatten. U kunt abstracte methoden gebruiken als u wilt dat de methode krachtig wordt overschreven in de afgeleide klassen van het type waarin de abstracte methode is gedefinieerd. Dit wordt afgedwongen tijdens het compileren door de compiler. Dus als je een methode als abstract hebt gedeclareerd met behulp van de abstracte modifier in een basisklasse, zouden de subklassen van deze klasse de abstracte methode moeten implementeren, anders zou de compiler een foutmelding geven waarin staat dat de afgeleide klasse de samenvatting niet heeft geïmplementeerd lid. In essentie,een abstracte methode wordt gedeclareerd met behulp van het abstracte sleutelwoord in een abstracte basisklasse en niet-abstracte subklassen van dit type moeten hun eigen implementatie van de abstracte methode hebben. Abstracte methoden zijn ook impliciet virtueel van aard, maar u kunt het virtuele sleutelwoord niet gebruiken bij het declareren van een abstracte methode. Opgemerkt moet worden dat abstracte methoden alleen binnen abstracte klassen kunnen worden gedeclareerd.

Een typisch gebruik van een abstracte methode is om het overschrijven van de methoden ToString () of Equals () af te dwingen. Het volgende codefragment illustreert hoe abstracte methoden worden gedeclareerd in een abstracte klasse met de naam 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

}

De EntityBase-klasse is het basistype voor alle entiteiten - de Customer entity-klasse breidt deze klasse uit en biedt implementatie voor de abstracte methoden. In wezen zouden alle entiteitsklassen hun eigen implementatie van de methoden ToString () en Equals () bieden. Er is geen standaardimplementatie voor deze methoden nodig in de basisklasse en daarom worden ze gemarkeerd als abstract. Het overschrijven van methoden wordt dus afgedwongen door de methode als abstract te declareren in de basisklasse met de naam EntityBase.