Введение в виртуальное ключевое слово в C #

Что такое виртуальное ключевое слово? Прежде чем перейти непосредственно к перспективе C #, важно понять или пересмотреть концепцию наследования, переопределения и виртуального ключевого слова в мире объектно-ориентированного программирования.

Переопределение метода - это концепция ООП, тесно связанная с наследованием. Когда метод дочернего класса переопределяет метод родительского класса с тем же именем, параметрами и типом возврата, это называется переопределением метода. Виртуальное ключевое слово указывает компилятору, что метод может быть переопределен в производных классах.

Что касается перспективы C #, ключевое слово virtual используется для изменения объявления любого свойства, метода или события, чтобы разрешить переопределение в производном классе. Проще говоря, виртуальное ключевое слово реализует концепцию переопределения метода в C #.

Синтаксис

Любое свойство, метод или событие можно переопределить, добавив ключевое слово virtual в базовый класс и ключевое слово override в производном классе.

Добавьте виртуальное ключевое слово в объявлении базового класса:

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

Добавьте ключевое слово override в объявление базового класса:

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
)

Как работает Virtual в 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 мы объявили два свойства и один метод виртуальными. Теперь они могут быть переопределены в дочерних классах. Теперь мы создаем различные дочерние классы разных форм, наследующие класс Polynomial.

В классе Rectangle нам не нужно переопределять какое-либо свойство или метод. Реализация базового класса будет работать как есть для класса Rectangle.

В классе Square у нас нет свойства width. Таким образом, мы переопределяем свойство length и метод Area, чтобы вернуть квадрат длины.

В классе Circle у нас нет ни длины, ни ширины. Итак, мы объявляем новое специфичное для класса свойство radius и соответственно переопределяем метод 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 #. Здесь мы обсуждаем, как работает Virtual C в C # и как вышеприведенный код работает с многоуровневым наследованием и преимуществами. Вы также можете посмотреть следующую статью, чтобы узнать больше

  1. Копировать конструктор в C #
  2. Наследование в C #
  3. Функции C #
  4. C # если заявление
  5. Если заявление в Python
  6. Перегрузка в Java
  7. Перегрузка Python
  8. Наследование в PHP
  9. Полное руководство по наследованию в Python
  10. Типы конструктора в C # с реализацией кода