Mail.ruПочтаМой МирОдноклассникиВКонтактеИгрыЗнакомстваНовостиКалендарьОблакоЗаметкиВсе проекты

Объясните пожалуйста понятным языком для чего нужны virtual и override в c#?

Kirieshkins Ученик (37), на голосовании 5 месяцев назад
Все говорят что это переопределение методов. Но в ходе моих тестов это вообще не выглядит как переопределение. Все равно вызывается метод из дочернего класса. Сам по себе навязывается вопрос: в чем проблема просто создать отдельный метод? Ну например в базовом классе есть метод выводящий строку «я машина и я быстро еду», а в дочернем идет «переопределение» этого метода, и теперь он выводит «я машина и я очень быстро еду». И если вызвать этот метод из дочернего класса который как бы «переопределяет», то вызовется как раз метод из дочернего класса со своими функционалом, а не метод базового класса с измененным функционалом. Тогда по сути это теряет вообще какой либо смысл, потому что зачем морочиться со всякими переопределениями, если можно убрать эти два модификатора, изменить название и отличий вообще не будет. Я вообще ничего не понимаю, объясните пожалуйста
Голосование за лучший ответ
Zadir.WT Профи (509) 6 месяцев назад
override - используем данную версию функции вместо версии в родителе (более высший класс)
virtual - данную функцию мы можем исполнить по-своему в ребенке (подклассе)
Объекты унаследованных классов принадлежат не только своему классу, но и родительскому классу. Поэтому переменная, имеющая тип базового класса, может содержать ссылку на объект любого дочернего класса, а не только на объект базового класса. Допустим, в базовом классе и в дочернем классе есть метод Show. Если он не виртуальный, то будет вызван метод Show из того класса, который указан как тип переменной. Если Show виртуальный метод, то будет вызван метод Show из класса к которому фактически принадлежит объект. Это называется полиморфизм, поскольку вызываемый метод зависит от класса, которому принадлежит объект.
Пример.

class Base
{
public void Show1() { Console.WriteLine("Base.Show1"); }
public virtual void Show2() { Console.WriteLine("Base.Show2"); }
}

class A : Base
{
public new void Show1() { Console.WriteLine("A.Show1"); }
public override void Show2() { Console.WriteLine("A.Show2"); }
}

Base b = new Base();
b.Show1(); // Base.Show1
b.Show2(); // Base.Show2

Base a = new A();
a.Show1(); // Base.Show1
a.Show2(); // A.Show2

A aa = new A();
aa.Show1(); // A.Show1
aa.Show2(); // A.Show2
А Мудрец (14803) 6 месяцев назад
Так смысл в том, чтобы получить полиморфизм. А если создавать новый метод с другим именем, то тебе и тип объекта нужно знать, чтобы его вызвать и смысл наследования теряется.
А объекты дочерних классов хранятся и передаются обычно через ссылку типа базового класса.
Jurijus Zaksas Искусственный Интеллект (445796) 6 месяцев назад
Смысл в том, что можно стандартизировать работу с классом на уровне предка, и детализировать на уровне потомка.
Самым очевидным примером является метод object.ToString()
Поскольку все наследуется от object, он есть вообще у всех классов.
Поэтому, все объекты можно помещать в списочные компоненты или просто выводить в консоль. При этом на экране ты увидишь результат работы именно этого метода.
Но для своего класса ты можешь его переопределить, если тебе нужно собственное отображение твоего объекта, а стандартное тебя не устраивает.

>то вызовется как раз метод из дочернего класса со своими функционалом, а не метод базового класса с измененным функционалом
А в чем разница-то? У потомка есть доступ к предку, меняй его как хочешь.
Вообще, потомок - это не отдельный класс. Это как бы надстройка над предком.
Похожие вопросы