При создании класса
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() важно, какой тип вашей ссылки, а тип самого объекта не важен.
Комментариев нет:
Отправить комментарий