Наследование 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 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"); } } } }
В данном случае, метод 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
Надеюсь, что это поможет!