UpCast C#.Override и Virtual

239
26 ноября 2017, 11:55

При создании класса

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
--------------------

Почему вызывается метод не из базового класса?

Answer 1

Смотрите.

Разница между override-цепочкой и new-цепочкой методов состоит в следующем.

При указании virtual/override вызывается метод у вашего реального типа, того, которым на самом деле обладает объект. То, какой при этом тип ссылки, по которой вы совершаете вызов, не важно, лишь бы тип этой ссылки содержал метод из вашей override-цепочки.

Поэтому для метода Method() важно то, объект какого класса вы создаёте в реальности, а тип ссылки не важен.

При указании new вызывается метод у вашего заказанного типа, то есть, типа ссылки, а не реального типа вашего объекта.

Поэтому для метода Print() важно, какой тип вашей ссылки, а тип самого объекта не важен.

READ ALSO
C# вызов методов предка

C# вызов методов предка

Чисто вопрос интереса радиВозможно ли вызвать метод старее чем предок из потомка? Чтонибудь типа

234
Поиск чисел в string

Поиск чисел в string

Решаю задачу:

295
Папка создается не в нужном месте C#

Папка создается не в нужном месте C#

Добрый деньНаписал приложение-1 на C#, которое создает папку

248