При создании класса
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Back
{
class Bugay
{
public virtual void Method()
{
string b = "Base: ";
Console.WriteLine(b + "Здраствуйте,сударь");
}
public void Print()
{
Console.WriteLine("Class Bugay");
}
}
class Bugay2 : Bugay
{
public override void Method()
{
string b = "NotBase: ";
Console.WriteLine(b + "До свидания,сударь");
}
new public void Print()
{
//base.Print();
Console.WriteLine("Class Bugay2");
}
}
class OverVirt
{
static void Main(string[] args)
{
Bugay2 bugay = new Bugay2();
bugay.Method();
bugay.Print();
Console.WriteLine(new string('-',20));
Bugay nebugay = bugay;
nebugay.Method();
nebugay.Print();
Console.WriteLine(new string('-', 20));
Bugay nebugay2 = new Bugay();
nebugay2.Method();
nebugay2.Print();
Console.WriteLine(new string('-',20));
Bugay2 bugay2 = (Bugay2)nebugay;
bugay2.Method();
bugay.Print();
Console.WriteLine(new string('-', 20));
Console.ReadKey();
}
}
}
при UpCast , метод который был пере-реализован с помощью override и virtual , вызывается из класса который наследует базовый класс (Bugay2) , то есть который был пере-реализован в этом классе Вывод:
NotBase: До свидания,сударь
Class Bugay2
--------------------
NotBase: До свидания,сударь
Class Bugay
--------------------
Base: Здраствуйте,сударь
Class Bugay
--------------------
NotBase: До свидания,сударь
Class Bugay2
--------------------
Почему вызывается метод не из базового класса?
Смотрите.
Разница между override-цепочкой и new-цепочкой методов состоит в следующем.
При указании virtual/override вызывается метод у вашего реального типа, того, которым на самом деле обладает объект. То, какой при этом тип ссылки, по которой вы совершаете вызов, не важно, лишь бы тип этой ссылки содержал метод из вашей override-цепочки.
Поэтому для метода Method() важно то, объект какого класса вы создаёте в реальности, а тип ссылки не важен.
При указании new вызывается метод у вашего заказанного типа, то есть, типа ссылки, а не реального типа вашего объекта.
Поэтому для метода Print() важно, какой тип вашей ссылки, а тип самого объекта не важен.
Современные инструменты для криптотрейдинга: как технологии помогают принимать решения
Апостиль в Лос-Анджелесе без лишних нервов и бумажной волокиты
Основные этапы разработки сайта для стоматологической клиники
Продвижение своими сайтами как стратегия роста и независимости