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