如何从已重写的子类对象中调用超类方法?

时间:2018-11-01 21:41:11

标签: c# oop polymorphism

我一直在阅读有关Polymorphism的内容,并且经历了一些有趣的事情。

我创建了两个类:超类和派生类。如您所见,派生类继承自超类并使用其方法。

在派生类中,我重写了超类的方法。

所以我的问题是:我想从派生类的对象中调用超类方法

例如:

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

我希望a.methood()执行超类方法。

有可能吗?

3 个答案:

答案 0 :(得分:4)

总结您的问题:您有一个基类和一个派生类。派生类将覆盖基类的虚拟方法。给定派生类的实例,是否可以强制调用该方法的基类版本而不是派生类?

简短的回答:是的。在课堂以外,没有。

基本上,您希望在此处执行的是对虚拟方法的非虚拟调用。对基类方法进行非虚拟调用是合法的,但是仅从类内部进行

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可能会将此类尝试标记为违反其“已验证代码”规则。 为了您的方便和安全起见,存在虚拟覆盖规则。请勿尝试绕过这些规则。

答案 1 :(得分:1)

在派生类之外是不可能的。在派生类中。

如果定义了以下类:

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”

答案 2 :(得分:0)

您可以尝试根据需要调用基本方法,如果有某种条件,根据您要调用的基础条件,也可以使用该条件。

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();