Почему вызывается метод класса-наследника
class A
{
public void Do()
{
Console.WriteLine("Метода класса A");
}
}
class B : A
{
public void Do()
{
Console.WriteLine("Метода класса B");
}
}
Program.cs
class Program
{
static void Main(string[] args)
{
A b = new B();
b.Do();
}
}
Почему вызывается метод базового класса,а не дочернего,это связанно с раннем связыванием? если:
B b = new B();
b.Do(); // Произойдет вызов метод дочернего класса,это неявное затенение от Visual Studio получается?
Ответы (2 шт):
Немного не так. Чтобы метод в классе наследнике был перезаписан, то нужно объявить в родителе метод как abstract или virtual(https://docs.microsoft.com/ru-ru/dotnet/csharp/language-reference/keywords/virtual). А в классе потомке перезаписать этот метод override(https://docs.microsoft.com/ru-ru/dotnet/csharp/language-reference/keywords/override).
Если же вы этого не делаете, то в вашем случае в классе потомке два метода Do(Среда показывает ошибку сокрытия метода, в моем случае реализует только метод родителя при вызове.)
class A
{
public virtual void Do()
{
Console.WriteLine("Метода класса A");
}
}
class B : A
{
public override void Do()
{
Console.WriteLine("Метода класса B");
}
}
class Program
{
static void Main(string[] args)
{
A b = new B();
b.Do();
}
}
В C# есть 2 вида вызова метода: обычный и виртуальный – вам нужен витруальный. Вот пример:
public class A
{
public virtual void Do() { Console.WriteLine("A"); }
}
public class B : A
{
public override void Do() { Console.WriteLine("B") }
}
Пример:
A aRefsToB = new B();
A aRefsToA = new A();
aRefsToB.Do(); // B
aRefsToA.Do(); // A