Utforska virtuella och abstrakta metoder i C #

Programmeringsspråket C # ger stöd för både virtuella och abstrakta metoder, som alla har distinkta fördelar. Du använder virtuella metoder för att implementera sen bindning, medan abstrakta metoder gör att du kan tvinga underklasserna av typen att ha metoden uttryckligen åsidosatt. I det här inlägget kommer jag att presentera en diskussion om både virtuella och abstrakta metoder och när de ska användas.

En virtuell metod är en som deklareras som virtuell i basklassen. En metod förklaras som virtuell genom att ange nyckelordet "virtuellt" i metodens signatur. En virtuell metod kan ha en returtyp eller inte. Virtuella metoder tillåter underklasser av typen att åsidosätta metoden. De används för att implementera polymorfism under körning eller sen bindning. Det bör noteras att virtuella eller abstrakta medlemmar i en klass inte kan förklaras som privata. Du kan också ha en implementering i en virtuell metod, dvs. virtuella metoder kan ha implementeringar i sig. Dessa implementeringar kan åsidosättas av underklasserna av den typ där den virtuella metoden har definierats.

MSDN säger: "Det virtuella nyckelordet används för att modifiera en metod, egendom, indexerare eller händelsedeklaration och tillåta att den åsidosätts i en härledd klass."

Låt oss nu gräva in lite kod för en bättre tydlighet om hur virtuella metoder används. Se kodavsnittet nedan.

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

}

}

Testmetoden () deklareras som virtuell i basklassen och åsidosätts i den härledda klassen. Observera hur det virtuella nyckelordet används för att förklara metoden som virtuell i basklassen. Det virtuella nyckelordet behövs inte när du åsidosätter den virtuella metoden i Derived-klassen.

Se nu kodavsnittet nedan som illustrerar hur virtuella metoder kallas.

class Program

{

static void Main()

{

Base baseObj1 = new Base();

baseObj1.Test();

Base baseObj2 = new Derived();

baseObj2.Test();

}

}

Observera att två instanser av basklassen skapas - baseObj1 och baseObj2. I det första fallet hänvisar referensobjektet med namnet baseObj1 till en instans av basklassen. I det andra fallet hänvisar referensobjektet med namnet baseObj2 till en instans av klassen Derived. När du kör koden kommer det första samtalet till den virtuella metoden att visa meddelandet "Detta är basversionen av den virtuella metoden" i konsolen. I det andra fallet visas meddelandet "Detta är den härledda versionen av den virtuella metoden". Varför denna skillnad?

I det första fallet beaktas typen av referensobjektet baseObj1 - eftersom det är av bastyp kommer basversionen av den virtuella metoden att kallas. I det andra fallet kommer sammanhanget för referensobjektet baseObj2 att beaktas och därmed resultatet.

Abstract methods are those that are declared abstract in the base class and cannot have implementations in them, i.e., they cannot have any functionality in them. You can use abstract methods when you would like the method to be overridden forcefully in the derived classes of the type in which the abstract method has been defined. This is enforced at compile time by the compiler. So, if you have declared a method as abstract using the abstract modifier in a base class, the subclasses of this class would have to implement the abstract method failing which the compiler would display an error stating that the derived class hasn't implemented the abstract member. In essence, an abstract method is declared using the abstract keyword in an abstract base class and non-abstract subclasses of this type have to have their own implementation of the abstract method. Abstract methods are also implicitly virtual in nature but you cannot use the virtual keyword when declaring an abstract method. It should be noted that abstract methods can only be declared inside abstract classes.

En typisk användning av en abstrakt metod är att tvinga överstyrning av ToString () eller Equals () -metoderna. Följande kodavsnitt illustrerar hur abstrakta metoder deklareras i en abstrakt klass med namnet 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

}

EntityBase-klassen är bastypen för alla enheter - klassen EntityBase utökar denna klass och ger implementering av de abstrakta metoderna. I huvudsak skulle alla entitetsklasser tillhandahålla sin egen implementering av metoderna ToString () och Equals (). Ingen standardimplementering för dessa metoder behövs i basklassen och därför markeras de som abstrakta. Så metodöverstyrning verkställs genom att förklara metoden som abstrakt i basklassen med namnet EntityBase.