Как вызвать метод суперкласса из объекта подкласса, который был переопределен? - PullRequest
0 голосов
/ 02 ноября 2018

Я читал о Полиморфизме , и я прошел через кое-что интересное.

Я создал два класса: суперкласс и производный класс. Как вы можете видеть, производный класс наследует от суперкласса и использует его метод.

В производном классе я переопределил метод суперкласса.

Итак, мой вопрос: Я хочу вызвать метод суперкласса из объекта производного класса

Например:

derivedClass a = new derivedClass()
a.method();

Я хочу, чтобы a.methood() выполнил метод суперкласса.

Это возможно?

Ответы [ 3 ]

0 голосов
/ 02 ноября 2018

Подводя итог вашему вопросу: у вас есть базовый класс и производный класс. Производный класс переопределяет виртуальный метод базового класса. При наличии экземпляра производного класса можно ли принудительно вызвать версию метода базового класса вместо производного класса?

Краткий ответ: Да, внутри класса. Снаружи класса, нет.

По сути, здесь вы хотите сделать не виртуальный вызов виртуального метода . Разрешается делать не виртуальный вызов метода базового класса, но только внутри класса :

class B
{
  public virtual void M() { Console.WriteLine("B.M"); }
}
class D : B
{
  public override void M() { Console.WriteLine("D.M"); }
  public void BM() { base.M(); }
}
...
D d = new D();
d.M(); // D.M
d.BM(); // B.M

Теперь для продвинутых игроков это хитрые способы вызова B.M с экземпляром D в качестве получателя, и я не собираюсь рассказывать вам, кто они. Вы не должны пытаться сделать это. CLR может помечать такие попытки как нарушения своих правил «проверенного кода». Правила виртуального переопределения существуют для вашего удобства и безопасности. Не пытайтесь выполнить эти правила в конце концов.

0 голосов
/ 02 ноября 2018

Вы можете попробовать вызвать базовый метод согласно вашему требованию, если есть какое-то условие, в соответствии с которым вы хотите вызвать его, вы также можете использовать это условие.

public class SubClass : SuperClass
{
    public bool IsCallBaseClassMethod { get; set; }

    public override void Method(){
        if (IsCallBaseClassMethod)
        {
            base.Method();
        }
    }
}

Установите условие в соответствии с вашим требованием для объекта и вызовите метод для того же объекта.

SubClass testObject = new SubClass();
testObject.IsCallBaseClassMethod  = true;
testObject.Method();
0 голосов
/ 02 ноября 2018

Со стороны производного класса это невозможно. Из производного класса это так.

Если у вас определены следующие классы:

class A
{
  public virtual void Method1() { Console.WriteLine("A"); }
}
class B : A
{
  override public void Method1() { Console.WriteLine("B"); }
  public void BaseMethod1() { base.Method1(); }
}

Вы можете выполнить следующее:

  B b = new B();
  b.Method1(); //Outputs "B"
  b.BaseMethod1(); //Outputs "A"
  ((A)b).Method1(); //***Outputs "B" (even though you cast it as A)

Если вы измените overide на new, тогда вывод последней строки будет "A"

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