Вступ до віртуального ключового слова в C #

Що таке віртуальне ключове слово? Перш ніж перейти до точки зору C #, важливо зрозуміти або переглянути концепцію успадкування, переосмислення та віртуального ключового слова у об'єктно-орієнтованому світі програмування.

Метод переосмислення - це концепція OOP, тісно пов'язана зі спадщиною. Коли метод дочірнього класу перевизначає однойменний метод батьківського класу, параметри та тип повернення, його називають методом переопределення. Віртуальне ключове слово - це вказівка ​​компілятору, що метод може бути замінений у похідних класах.

Переходячи до точки зору 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());
)
)

Як працює вищезазначений код?

У базовому класі Polynomial ми оголосили два властивості та один метод як віртуальний. Зараз їх можна скасувати в дитячих класах. Тепер ми створюємо різні дочірні класи різної форми, що успадковують клас Поліном.

У класі Rectangle нам не потрібно змінювати жодних властивостей чи методів. Реалізація базового класу спрацює так, як є для класу Rectangle.

У класі Square у нас немає властивості ширини. Тому ми перекриваємо властивість довжини та метод Area, щоб повернути квадрат довжини.

У класі Circle у нас немає ні довжини, ні ширини. Отже, ми оголошуємо нову властивість радіусу, характерну для класу, і відповідно заміняємо метод Area.

У класі Triangle ми просто перекриваємо метод Area, а властивості успадковуються від базового класу Polynomial.

Коли ми створюємо об'єкти похідних класів, компілятор стикається з віртуальним ключовим словом під час побудови базового класу і, таким чином, шукає перекритих членів. Потім перекликаються члени відповідно.

Багаторівневе спадкування

Давайте змінимо вищенаведений приклад, щоб включити багаторівневе успадкування.

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 # та як працює вищезазначений код із багаторівневим спадком і перевагами. Ви також можете переглянути наступну статтю, щоб дізнатися більше -

  1. Конструктор копіювання в C #
  2. Спадщина в C #
  3. C # Функції
  4. C # якщо заява
  5. Якщо заява в Python
  6. Перевантаження в Java
  7. Перевантаження Python
  8. Спадщина в PHP
  9. Повне керівництво по спадщині в Python
  10. Типи конструктора в C # з реалізацією коду