Что такое виртуальные методы? - PullRequest
64 голосов
/ 07 марта 2009

Почему вы объявляете метод как "виртуальный".

Какая выгода от использования виртуальной?

Ответы [ 15 ]

1 голос
/ 31 марта 2015

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

    public class sample {
      public virtual void fun(){
        Console.WriteLine("base sample class \n");
      }
    }
    public class A : sample{
      public override void fun(){
        Console.WriteLine("Class A \n");
      }
    }
    public class B : sample{
      public override void fun(){
        Console.WriteLine("Class B \n");
      }
    }
    class run{
      public static void main(String[] args){
        sample obj = new sample();
        sample obj1 = new A();
        sample obj2 = new B();
        obj.fun();
        obj1.fun();
        obj2.fun();
      }
    }
1 голос
/ 07 марта 2009

Излишне говорить, что виртуальные методы пригодятся, когда ваш код пытается придерживаться принципа Open Closed

Подробнее об Открытом Закрытом Принципе здесь , оригинальный документ OCP дяди Боба.

Также имейте в виду, что методы не виртуальные по умолчанию в C # в отличие от Java.

0 голосов
/ 20 февраля 2019

В C # для переопределения метода базового класса в производном классе вы должны объявить метод базового класса как метод виртуального и производного класса как переопределение, как показано ниже:

using System;
namespace Polymorphism
{
 class A
 {
 public virtual void Test() { Console.WriteLine("A::Test()"); }
 }

 class B : A
 {
 public override void Test() { Console.WriteLine("B::Test()"); }
 }

 class C : B
 {
 public override void Test() { Console.WriteLine("C::Test()"); }
 }

 class Program
 {
 static void Main(string[] args)
 {

 A a = new A();
 B b = new B();
 C c = new C();
 a.Test(); // output --> "A::Test()"
 b.Test(); // output --> "B::Test()"
 c.Test(); // output --> "C::Test()"

 a = new B();
 a.Test(); // output --> "B::Test()"

 b = new C();
 b.Test(); // output --> "C::Test()"

 Console.ReadKey();
 }
 }
}

Вы также можете смешать скрытие метода и переопределение метода, используя ключевое слово virtual и new, поскольку метод производного класса может быть виртуальным и новым одновременно. Это необходимо, если вы хотите переопределить метод производного класса на следующем уровне, так как я переопределяю метод класса B, Test () в классе C, как показано ниже:

using System;
namespace Polymorphism
{
 class A
 {
 public void Test() { Console.WriteLine("A::Test()"); }
 }

 class B : A
 {
 public new virtual void Test() { Console.WriteLine("B::Test()"); }
 }

 class C : B
 {
 public override void Test() { Console.WriteLine("C::Test()"); }
 }

 class Program
 {
 static void Main(string[] args)
 {

 A a = new A();
 B b = new B();
 C c = new C();

 a.Test(); // output --> "A::Test()"
 b.Test(); // output --> "B::Test()"
 c.Test(); // output --> "C::Test()"

 a = new B();
 a.Test(); // output --> "A::Test()"

 b = new C();
 b.Test(); // output --> "C::Test()"

 Console.ReadKey();
 }
 }
}

ЗОЛОТЫЕ СЛОВА: Ключевое слово virtual используется для изменения метода, свойства, индексатора или события, объявленного в базовом классе, и позволяет переопределять его в производном классе.

Ключевое слово override используется для расширения или изменения виртуального / абстрактного метода, свойства, индексатора или события базового класса в производный класс.

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

НАСЛАЖДАЙТЕСЬ: -)

0 голосов
/ 23 июля 2018

разница между виртуальными и не виртуальными методами.

У нас есть два класса; один класс Vehicle , а другой класс Cart . Класс «Автомобиль» - это базовый класс, который имеет два метода; один - это виртуальный метод «Speed ​​()», а другой - не виртуальный метод «Average ()». Таким образом, виртуальный метод базового класса "Speed ​​()" переопределяется в подклассе. У нас есть еще один класс «Программа» (класс исполнения), имеющий точку входа, в которой мы создаем экземпляр подкласса «Корзина», и этот экземпляр присваивается типу базового класса «Автомобиль». Когда мы вызываем виртуальные и не виртуальные методы экземпляром обоих классов, то в соответствии с типом запуска вызывается реализация виртуального метода экземпляра; другими словами, оба экземпляра класса вызывают метод переопределения подкласса, а вызываемый не виртуальный метод определяется на основе экземпляра класса.

using System;

namespace VirtualExample
{   
    class Vehicle
    {   
       public double distance=0.0;
       public double hour =0.0;
       public double fuel =0.0; 

       public Vehicle(double distance, double hour, double fuel)
       {
           this.distance = distance;
           this.hour = hour;
           this.fuel = fuel;
       }

       public void Average()
       {
           double average = 0.0;
           average = distance / fuel;
           Console.WriteLine("Vehicle Average is {0:0.00}", average);
       }

       public virtual void Speed()
       {
           double speed = 0.0;
           speed = distance / hour;
           Console.WriteLine("Vehicle Speed is {0:0.00}", speed);
       }
    } 

    class Car : Vehicle
    {
        public Car(double distance, double hour, double fuel)
            : base(distance, hour, fuel)
        {
        }
      public void Average()
        {
            double average = 0.0;
            average = distance / fuel;
            Console.WriteLine("Car Average is {0:0.00}", average);
        }

        public override void Speed()
        {
            double speed = 0.0;           
            speed = distance / hour;
            Console.WriteLine("Car Speed is {0:0.00}", speed);
        }
    } 

    class Program
   {
        static void Main(string[] args)
        {
             double distance,hour,fuel=0.0;
             Console.WriteLine("Enter the Distance");
             distance = Double.Parse(Console.ReadLine());
             Console.WriteLine("Enter the Hours");
             hour = Double.Parse(Console.ReadLine());
             Console.WriteLine("Enter the Fuel");
             fuel = Double.Parse(Console.ReadLine());
             Car objCar = new Car(distance,hour,fuel);
             Vehicle objVeh = objCar;
             objCar.Average();
             objVeh.Average();
             objCar.Speed();
             objVeh.Speed();
            Console.Read();
        }       
    }
}

enter image description here

надеюсь помочь!

0 голосов
/ 09 ноября 2017

Эта ссылка поможет вам лучше понять очень простой пример. https://stackoverflow.com/a/2392656/3373865

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...