Въведение във виртуалната ключова дума в C #
Какво е виртуалната ключова дума? Преди да скочите право в перспектива на C #, е важно да разберете или преразгледате концепцията за наследяване, преобладаване и виртуална ключова дума в обектно-ориентирания програмен свят.
Метод Overriding е концепция OOPs, тясно свързана с Наследяването. Когато методът на дочерния клас отменя метода на родителския клас със същото име, параметри и тип връщане, той се нарича като метод за отмяна. Виртуалната ключова дума е индикация за компилатора, че метод може да бъде отменен в производни класове.
Влизайки в перспективата на C #, виртуалната ключова дума се използва за промяна на декларацията за всяко свойство, метод или събитие, за да позволи преодоляване на производен клас. Казано по-просто, виртуалната ключова дума реализира концепцията за отмяна на метода в C #.
Синтаксис
Всяко свойство, метод или събитие може да бъде отменено чрез добавяне на виртуалната ключова дума в базовия клас и отмяна на ключовата дума в производния клас.
Добавете виртуалната ключова дума в декларацията на базовия клас:
public class Base (
public virtual int abc ( get; set; ) // this property can be overridden
public virtual void Xyz() ( ) // this method can be overridden
)
Добавете ключова дума за замяна в декларацията на базовия клас:
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
)
Как виртуалните работи в C #?
Основната разлика между претоварването и преодоляването е, че първата е механизъм за компилиране, докато втората влиза в игра по време на изпълнение. Виртуална ключова дума влиза в действие по време на изпълнение, като по този начин реализира концепцията за преобладаващ метод.
Когато някой виртуален метод или свойство се извиква или получава достъп, компилаторът проверява за по-висок член на метода или свойството. Ако някой бъде намерен, той се извиква. Ако не се намери, се извиква оригиналният метод или свойство.
Тук възниква отличен въпрос - какво се случва в случай на многостепенно наследяване? Е, ако който и да е член на класа се отмени на повече от едно ниво, се извиква най-дълбокият преодолян член (този в най-извлечения клас).
пример
Следният пример за виртуална ключова дума в C # е споменат по-долу
Наследяване на едно ниво
Нека вземем пример, за да разберем работата на виртуална ключова дума, когато един единствен детски клас наследява родителския клас, т.е. няма многостепенно наследяване.
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());
)
)
Как работи горният код?
В базовия клас Полином сме декларирали две свойства и един метод като виртуален. Те вече могат да бъдат отменени в часовете за деца. Сега създаваме различни детски класове с различни форми, наследяващи клас полиноми.
В класа Rectangle не е необходимо да отменяме нито едно свойство или метод. Реализацията на базовия клас ще работи както е за клас Rectangle.
В клас Square нямаме свойството ширина. Така че ние отменяме свойството length и метода Area, за да върнем квадрата на дължината.
В класа Circle нито имаме дължина, нито ширина. И така, ние декларираме ново специфично за класа свойство радиус и съответно заместваме метода Area.
В класа Триъгълник ние просто отменяме метода Area и свойствата са наследени от базовия клас Полином.
Когато създаваме обекти на производни класове, компилаторът среща виртуалната ключова дума по време на изграждането на базовия клас и по този начин търси презаписаните членове. След това презаписаните членове се извикват съответно.
Наследяване на много нива
Нека модифицираме горния пример, за да включим наследяване на много нива.
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());
)
)
Предимства
Виртуален член има декларации и дефиниции както в базовия клас, така и в производни класове. Виртуалните членове са изгодни, когато се изискват някои допълнителни функционалности в извлечените класове. Те служат като добавки.
правилник
- Променлива не може да бъде обявена за виртуална. Само свойства, методи и събития могат да бъдат декларирани като виртуални.
- Статичният член не може да бъде обявен за виртуален.
- Абстрактният член не може да бъде обявен за виртуален.
- Частен член не може да бъде обявен за виртуален.
- Невиртуален член не може да бъде отменен.
- Нивото на достъп, типът и името както на виртуалните членове, така и на преобладаващите членове трябва да бъдат еднакви. Например, ако виртуалният метод е публичен, преобладаващият метод също трябва да бъде публичен.
Заключение - Виртуална ключова дума в C #
В тази статия разбрахме концепцията за виртуално в C #. Видяхме как C # реализира виртуалната ключова дума по време на изпълнение и разгледахме примерите.
Виртуалните членове са страхотна концепция за обектно-ориентирано програмиране. Въпреки това, за да придобиете задълбочени познания, силно се препоръчва да научите за абстрактна ключова дума, интерфейси и нова ключова дума. Това би помогнало много за разбирането на разликата между всички тях. Това помага при осъзнаването кога да се използва и кога да не се използва виртуална.
Препоръчителни статии
Това е ръководство за виртуална ключова дума в C #. Тук обсъждаме как виртуалното работи в C # и как работи горният код с многостепенното наследяване и предимства. Можете също така да разгледате следната статия, за да научите повече-
- Копие конструктор в C #
- Наследяване в C #
- C # функции
- C # ако изявление
- Ако изявление в Python
- Претоварване в Java
- Python Overloading
- Наследяване в PHP
- Пълно ръководство за наследяване в Python
- Видове конструктор в C # с изпълнение на код