Наследование C# Есть код:using System;
namespace SomeStuff
{
class MainClass
{
public static void Main (string[] args)
{
A a = new A();
B b = new B();
A c = new C();
a.Display();
b.Display();
c.Display();
}
public class A
{
public virtual void Display()
{
Console.WriteLine("A");
}
}
public class B : A
{
public override void Display ()
{
Console.WriteLine("B");
}
}
public class C : B
{
public new void Display()
{
Console.WriteLine("C");
}
}
}
}
Ну почему выводит:
A
B
B
Почему выводит перегруженный метод класса, базового класса для C?
Спасибо!

21 Авг 2019 в 07:10
192 +1
0
Ответы
1

В данном случае, метод Display() в классе C объявлен с модификатором new, что означает, что это не переопределение метода Display() из класса B, а скрытие его. То есть, когда вы вызываете метод Display() на объекте типа A, который в действительности является объектом типа C, будет вызываться метод Display() из класса A, так как метод Display() из класса C скрывает метод Display() из класса B.

Чтобы метод Display() из класса C был вызван, необходимо переопределить метод Display() в классе C, как это было сделано в классе B.

Исправленный код будет выглядеть так:

using System;
namespace SomeStuff
{
class MainClass
{
public static void Main (string[] args)
{
A a = new A();
B b = new B();
A c = new C();
a.Display();
b.Display();
c.Display();
}
public class A
{
public virtual void Display()
{
Console.WriteLine("A");
}
}
public class B : A
{
public override void Display ()
{
Console.WriteLine("B");
}
}
public class C : B
{
public override void Display()
{
Console.WriteLine("C");
}
}
}
}

Теперь вывод будет:

A
B
C

Надеюсь, что это поможет!

20 Апр 2024 в 13:06
Не можешь разобраться в этой теме?
Обратись за помощью к экспертам
Гарантированные бесплатные доработки в течение 1 года
Быстрое выполнение от 2 часов
Проверка работы на плагиат
Поможем написать учебную работу
Прямой эфир