这个问题已经在这里有一个答案:
- 有什么办法来调用覆盖方法的父版本? (C#的.NET) 8分的回答
考虑下面的代码,是有办法,我可以调用A类的版本方法X吗?
class A
{
virtual void X() { Console.WriteLine("x"); }
}
class B : A
{
override void X() { Console.WriteLine("y"); }
}
class Program
{
static void Main()
{
A b = new B();
// Call A.X somehow, not B.X...
}
使用C#语言结构,可以没有明确的范围之外调用基函数A
或B
。 如果你真的需要做到这一点,那么在你的设计有一个缺点 - 即功能不应该是虚拟的,首先,还是基本函数的部分应被提取到一个单独的非虚拟函数。
您可以从里面 BX但是叫AX
class B : A
{
override void X() {
base.X();
Console.WriteLine("y");
}
}
但是,这是别的东西。
至于萨沙Truf在指出这个答案 ,你可以通过IL做到这一点。 你可能也完成它通过反射,如M手在评论中指出。
您无法通过C#这样做,但你可以编辑MSIL。
您的Main方法的IL代码:
.method private hidebysig static void Main() cil managed
{
.entrypoint
.maxstack 1
.locals init (
[0] class MsilEditing.A a)
L_0000: nop
L_0001: newobj instance void MsilEditing.B::.ctor()
L_0006: stloc.0
L_0007: ldloc.0
L_0008: callvirt instance void MsilEditing.A::X()
L_000d: nop
L_000e: ret
}
你应该从L_0008改变callvirt码调用
L_0008: call instance void MsilEditing.A::X()
你不能,你不应该。 这就是多态性是,让每个对象都有自己做一些“基地”事情的方式。
你可以这样做,但不是在一点上,你所指定。 在上下文B
,你可以调用AX()
调用base.X()
我konow这是历史问题了。 但对于其他的Google:你可以写这样的事情。 但是这需要在基类中的变化是什么使得它没用外部库。
class A
{
void protoX() { Console.WriteLine("x"); }
virtual void X() { protoX(); }
}
class B : A
{
override void X() { Console.WriteLine("y"); }
}
class Program
{
static void Main()
{
A b = new B();
// Call A.X somehow, not B.X...
b.protoX();
}
如果该方法在派生类中声明这是不可能overrides
。 要做到这一点,在派生类中的方法应该被声明为new
:
public class Base {
public virtual string X() {
return "Base";
}
}
public class Derived1 : Base
{
public new string X()
{
return "Derived 1";
}
}
public class Derived2 : Base
{
public override string X() {
return "Derived 2";
}
}
Derived1 a = new Derived1();
Base b = new Derived1();
Base c = new Derived2();
a.X(); // returns Derived 1
b.X(); // returns Base
c.X(); // returns Derived 2
见这里捣鼓
文章来源: How can I call the 'base implementation' of an overridden virtual method? [duplicate]