• Добро пожаловать на сайт - Forumteam.men !

    Что бы просматривать темы форума необходимо зарегестрироваться или войти в свой аккаунт.

    Группа в телеграме (подпишитесь, что бы не потерять нас) - ForumTeam Chat [Подписатся]
    Связь с администратором - @ftmadmin

20. Немного о виртуальности.

Redman

<FORUMTEAM>
Команда форума
Регистрация
13.11.17
Сообщения
13.343
Реакции
8.371
Баллы
1.200
FTC
203¢
Виртуальные методы.
Метод базового класса, которому при определении был указан модификатор virtual, и который был переопределен в одном или более потомственных классов называется виртуальным методом класса. Каждый наследник может иметь собственную версию виртуального метода. При вызове такого метода класса, выбор конкретной версии зависит от того типа объекта, на который ссылается ссылочная переменная, осуществляющая вызов. Выбор производится во время выполнения программы.

Таким образом, если класс является родительским для нескольких других классов и при этом в нем существует виртуальный метод, переопределенный в потомках, то тогда при ссылке переменной базового типа на различные типы объектов базового и производного типов будут производиться вызовы различных версий. При переопределении виртуального метода в дочернем классе ему указывается модификатор override. В потомке имя метода, параметры остаются прежними, как и в базовом классе. По отношению к виртуальным методам нельзя применять модификаторы static,abstract.

Кстати понятие виртуального метода вам уже известно из курса. С++. Рассмотрим пример:
Код:
using System;
class Animal{
    public Animal(string n){
        name=n;
    }
    private string name;
    public virtual void Sound(){ // виртуальный метод
        Console.WriteLine("Неизвестный Звук !!!");
    }
    public void ShowName(){
        Console.WriteLine(name);
    }
}
class Cat:Animal{
    public Cat(string name):base(name){}
    public override void Sound(){// переопределение виртуального метода
        Console.WriteLine("Мяу !!!");
    }
}
class Dog:Animal{
    public Dog(string name):base(name){}
    public override void Sound(){
        Console.WriteLine("Гав !!!");
    }
}

class Sample
{
    static void Main()
    {
        try{
            Animal p;
            Animal obj = new Animal("Неизвестное имя");
            Cat obj2 = new Cat("Мурка");
            Dog obj3 = new Dog("Полкан");
            p = obj;       
            p.Sound();// Animal::Sound
            p = obj2;
            p.Sound();//Cat::Sound
            p = obj3;
            p.Sound();//Dog::Sound
           
        }
        catch(Exception e){
            Console.WriteLine(e.Message);
        }
        Console.Read();
    }
}

Если в каком-то потомке виртуальный метод не переопределен, то тогда при вызове его используется метод базового класса. Давайте рассмотрим ещё один пример использования виртуальных методов:
Код:
using System;
class Animal{
    public Animal(string n){
        name=n;
    }
    private string name;
    public virtual void Sound(){
        Console.WriteLine("Неизвестный Звук !!!");
    }
    public void ShowName(){
        Console.WriteLine(name);
    }
}
class Cat:Animal{
    public Cat(string name):base(name){}
    public override void Sound(){
        Console.WriteLine("Мяу !!!");
    }
}
class Dog:Animal{
    public Dog(string name):base(name){}
    public override void Sound(){
        Console.WriteLine("Гав !!!");
    }
}

class Sample
{
    static void Main()
    {
        try{
            Animal[] arr = new Animal[3];
            arr[0] = new Animal("Без имени");
            arr[1] = new Cat("Василий");
            arr[2] = new Dog("Мелодия");
            for(int i = 0;i<arr.Length;i++){
                arr[i].Sound();
            }
        }
        catch(Exception e){
            Console.WriteLine(e.Message);
        }
        Console.Read();
    }
}
 
Сверху Снизу