Наследование 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? Спасибо!
В данном случае, метод Display() в классе C объявлен с модификатором new, что означает, что это не переопределение метода Display() из класса B, а скрытие его. То есть, когда вы вызываете метод Display() на объекте типа A, который в действительности является объектом типа C, будет вызываться метод Display() из класса A, так как метод Display() из класса C скрывает метод Display() из класса B.
Чтобы метод Display() из класса C был вызван, необходимо переопределить метод Display() в классе C, как это было сделано в классе B.
Исправленный код будет выглядеть так:
using System namespace SomeStuf
class MainClas
public static void Main (string[] args
A a = new A() B b = new B() A c = new C() a.Display() b.Display() c.Display()
В данном случае, метод Display() в классе C объявлен с модификатором new, что означает, что это не переопределение метода Display() из класса B, а скрытие его. То есть, когда вы вызываете метод Display() на объекте типа A, который в действительности является объектом типа C, будет вызываться метод Display() из класса A, так как метод Display() из класса C скрывает метод Display() из класса B.
Чтобы метод Display() из класса C был вызван, необходимо переопределить метод Display() в классе C, как это было сделано в классе B.
Исправленный код будет выглядеть так:
using Systemnamespace SomeStuf
class MainClas
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
public virtual void Display(
Console.WriteLine("A")
public class B :
public override void Display (
Console.WriteLine("B")
public class C :
public override void Display(
Console.WriteLine("C")
}
Теперь вывод будет:
C
Надеюсь, что это поможет!