// Cannot change source code
class Base
{
public virtual void Say()
{
Console.WriteLine("Called from Base.");
}
}
// Cannot change source code
class Derived : Base
{
public override void Say()
{
Console.WriteLine("Called from Derived.");
base.Say();
}
}
class SpecialDerived : Derived
{
public override void Say()
{
Console.WriteLine("Called from Special Derived.");
base.Say();
}
}
class Program
{
static void Main(string[] args)
{
SpecialDerived sd = new SpecialDerived();
sd.Say();
}
}
结果是:
Called from Special Derived.
Called from Derived. /* this is not expected */
Called from Base.
如何重写 SpecialDerived 类,以便不调用中间类“Derived”的方法?
更新:
我想从 Derived 而不是 Base 继承的原因是 Derived 类包含许多其他实现。由于我不能在这里执行 base.base.method()
,我想最好的方法是执行以下操作?
//无法更改源代码
class Derived : Base
{
public override void Say()
{
CustomSay();
base.Say();
}
protected virtual void CustomSay()
{
Console.WriteLine("Called from Derived.");
}
}
class SpecialDerived : Derived
{
/*
public override void Say()
{
Console.WriteLine("Called from Special Derived.");
base.Say();
}
*/
protected override void CustomSay()
{
Console.WriteLine("Called from Special Derived.");
}
}
最佳答案
只是想在这里添加这个,因为即使经过很多次人们仍然会回到这个问题。当然这是不好的做法,但仍然可以(原则上)做作者想做的事情:
class SpecialDerived : Derived
{
public override void Say()
{
Console.WriteLine("Called from Special Derived.");
var ptr = typeof(Base).GetMethod("Say").MethodHandle.GetFunctionPointer();
var baseSay = (Action)Activator.CreateInstance(typeof(Action), this, ptr);
baseSay();
}
}
关于c# - 如何调用base.base.method()?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2323401/