我一直在阅读有关Polymorphism的内容,并且经历了一些有趣的事情。
我创建了两个类:超类和派生类。如您所见,派生类继承自超类并使用其方法。
在派生类中,我重写了超类的方法。
所以我的问题是:我想从派生类的对象中调用超类方法
例如:
derivedClass a = new derivedClass()
a.method();
我希望a.methood()
执行超类方法。
有可能吗?
答案 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();