Introduktion till virtuellt nyckelord i C #

Vad är det virtuella nyckelordet? Innan du hoppar rätt in i C # -perspektivet är det viktigt att förstå eller revidera begreppet arv, övervägande och virtuellt nyckelord i den objektorienterade programmeringsvärlden.

Method Overriding är ett OOP-koncept som är tätt sammans med arv. När en barnklassmetod åsidosätter föräldraklassmetoden med samma namn, parametrar och returtyp benämns den som metodöverskridande. Ett virtuellt nyckelord är en indikation för kompilatorn att en metod kan åsidosättas i härledda klasser.

När det kommer till C # -perspektivet används det virtuella nyckelordet för att ändra deklarationen för egendom, metod eller händelse för att möjliggöra åsidosättning i en härledd klass. Enkelt uttryckt implementerar det virtuella nyckelordet det övergripande metodkonceptet i C #.

Syntax

Alla egenskaper, metoder eller händelser kan åsidosättas genom att lägga till det virtuella nyckelordet i basklassen och åsidosätta nyckelordet i den härledda klassen.

Lägg till det virtuella nyckelordet i basklassdeklarationen:

public class Base (
public virtual int abc ( get; set; ) // this property can be overridden
public virtual void Xyz() ( ) // this method can be overridden
)

Lägg till åsidosättande nyckelord i basklassdeklarationen:

public class Derived : Base (
public override int abc ( get; set; ) // this overrides the base class property
public override void Xyz() ( ) // this overrides the base class method
)

Hur fungerar virtuellt i C #?

Den mycket grundläggande skillnaden mellan överbelastning och överskridande är att den förstnämnda är en kompileringstidsmekanism, medan den senare spelar in under körning. Ett virtuellt nyckelord träder i kraft vid körning, och implementerar därmed metoden som är övervägande.

När någon virtuell metod eller egenskap anropas eller åtkomst kontrollerar kompilatorn efter en övervägande medlem av metoden eller egenskapen. Om en hittas, åberopas den. Om ingen finns hittas den ursprungliga metoden eller egenskapen.

Här uppstår en utmärkt fråga - vad händer i fallet med arv på flera nivåer? Tja, om någon klassmedlem åsidosätts på mer än en nivå, åberopas den djupaste åsidosatta medlemmen (den i den mest härledda klassen).

Exempel

Följande exempel på virtuellt nyckelord i C # nämns nedan

Arv på en nivå

Låt oss ta ett exempel för att förstå hur ett virtuellt nyckelord fungerar när en enskild barnklass ärver förälderklassen, dvs. det finns ingen arv på flera nivåer.

using System;
public class Polynomial
(
public virtual double len
(
get;
set;
)
public virtual double wid
(
get;
set;
)
public virtual double Area()
(
return len * wid;
)
)
public class Rectangle: Polynomial
(
)
public class Square : Polynomial
(
public override double len
(
get;
set;
)
public override double Area()
(
return len * len;
)
)
public class Circle : Polynomial
(
public double radius
(
get;
set;
)
public override double Area()
(
return Math.PI * radius * radius;
)
)
public class Triangle : Polynomial
(
public override double Area()
(
return 0.5 * len * wid;
)
)
public class Program
(
public static void Main()
(
var rect = new Rectangle();
rect.len = 5;
rect.wid = 10;
Console.WriteLine("Area of Rectangle = " + rect.Area());
var sq = new Square();
sq.len = 15;
Console.WriteLine("Area of Square = " + sq.Area());
var cir = new Circle();
cir.radius = 10;
Console.WriteLine("Area of Circle = " + cir.Area());
var tri = new Triangle();
tri.len = 5;
tri.wid = 10;
Console.WriteLine("Area of Triangle = " + tri.Area());
)
)

Hur fungerar ovanstående kod?

I basklassen Polynomial har vi förklarat två egenskaper och en metod som virtuell. Dessa kan nu åsidosättas i barnklasser. Nu skapar vi olika barnklasser av olika former som ärver polynomklassen.

I rektangelklassen behöver vi inte åsidosätta någon egenskap eller metod. Basklassimplementeringen skulle fungera som den är för rektangelklassen.

I Square-klassen har vi inte breddegenskapen. Så vi åsidosätter längdegenskapen och metodområdet för att returnera kvadratet med längden.

I cirkelklassen har vi varken längd eller bredd. Så vi förklarar en ny klassspecifik egenskap med radie och åsidosätter Area-metoden i enlighet därmed.

I triangelklassen åsidosätter vi helt enkelt Area-metoden och egenskaperna ärvs från basklassen Polynomial.

När vi skapar objekt från de härledda klasserna möter kompilatorn det virtuella nyckelordet under basklasskonstruktionen och letar därmed efter de åsidosatta medlemmarna. De åsidosatta medlemmarna åberopas därefter.

Arv på flera nivåer

Låt oss modifiera exemplet ovan för att inkludera arv från flera nivåer.

using System;
public class Polynomial
(
public virtual double len ( get; set; )
public virtual double wid ( get; set; )
public virtual double Area()
( return 0; )
)
public class Rectangle : Polynomial
(
public override double Area()
( return len * wid; )
)
public class Square : Rectangle
(
public override double len ( get; set; )
public override double Area()
( return len * len; )
)
public class Program
(
public static void Main()
(
var rect = new Rectangle();
rect.len = 5;
rect.wid = 10;
Console.WriteLine("Area of Rectangle = " + rect.Area());
var sq = new Square();
sq.len = 15;
Console.WriteLine("Area of Square = " + sq.Area());
)
)

fördelar

En virtuell medlem har deklarationer och definitioner i både basklassen och härledda klasser. Virtuella medlemmar är fördelaktiga när vissa extrafunktioner krävs i de härledda klasserna. De fungerar som tillägg.

regler

  • En variabel kan inte förklaras virtuell. Endast egenskaper, metoder och händelser kan deklareras som virtuella.
  • En statisk medlem kan inte förklaras virtuell.
  • En abstrakt medlem kan inte förklaras virtuell.
  • En privat medlem kan inte förklaras virtuell.
  • En icke-virtuell medlem kan inte åsidosättas.
  • Åtkomstnivån, typen och namnet på både virtuella medlemmar och de övergripande medlemmarna måste vara desamma. För t.ex. om den virtuella metoden är offentlig måste övervägande metod också vara offentlig.

Slutsats - Virtuellt nyckelord i C #

I den här artikeln förstod vi begreppet virtuella i C #. Vi såg hur C # implementerar det virtuella nyckelordet under körning och tittade på exemplen.

Virtuella medlemmar är ett bra koncept för objektorienterad programmering. Men för att få djup kunskap rekommenderas det starkt att lära sig om abstrakta sökord, gränssnitt och nytt nyckelord. Detta skulle hjälpa till att förstå skillnaden mellan dem alla. Detta hjälper till att inse när man ska använda och när man inte ska använda virtuellt.

Rekommenderade artiklar

Detta är en guide till virtuellt nyckelord i C #. Här diskuterar vi hur virtuellt fungerar i C # och hur fungerar ovanstående kod med flerfaldiga arv och fördelar. Du kan också titta på följande artikel för att lära dig mer-

  1. Kopiera konstruktör i C #
  2. Arv i C #
  3. C # funktioner
  4. C # om uttalande
  5. Om uttalande i Python
  6. Överbelastning i Java
  7. Python överbelastning
  8. Arv i PHP
  9. Komplett guide till arv i Python
  10. Typer av konstruktörer i C # med kodimplementering

Kategori: