Полиморфный вызов идет в базовый класс вместо подкласса - PullRequest
0 голосов
/ 15 февраля 2019

Когда объект типа C вызывает MethodX, я ожидаю, что вызов MethodY() в B (выделенный вопросительными знаками) завершится вызовом C MethodY.Но сеанс отладки показывает, что он вызывает A's MethodY().

. Я озадачен почему.Точка останова в B MethodX() ясно показывает, что this - это объект типа C. Я попробовал this.MethodY();, а также удалил виртуальный / переопределить и использовал new, с теми же результатами.Я перепутал с другим языком или я что-то упустил?

public abstract class A {
  protected virtual void MethodY() {...}   // This one's being called.
}

public class B : A {
  protected override void MethodY() {...}

  public override void MethodX() {
     MethodY();   // ???
  }
}

public class C : B {
  protected override void MethodY() {...}   // But want this one to be called

  protected override void MethodX() {
    base.MethodX();
    ...
  }
}

1 Ответ

0 голосов
/ 15 февраля 2019

Я ожидаю, что вызов MethodY() в B закончится вызовом C s MethodY

Это делает

public abstract class A
{
    public virtual void MethodX()
      => Console.WriteLine("A - X");

    public virtual void MethodY()
      => Console.WriteLine("A - Y");
}

public class B : A
{
    public override void MethodY()
      => Console.WriteLine("B - Y");

    public override void MethodX()
    {
        Console.WriteLine("B - X");
        MethodY();
    }
}

public class C : B
{
    public override void MethodY()
      => Console.WriteLine("C - Y");

    public override void MethodX()
    {
        Console.WriteLine("C - X");
        base.MethodX();
    }
}

public static void Main()
{
    var c = new C();
    c.MethodX();
}

Выход

C - X
B - X
C - Y

Полная демонстрация здесь

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...