// 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();
}
}
結果は次のとおりです。
Special Derivedから呼び出されました。
Derivedから呼び出されました。/ *これは予期されない* /
ベースから呼び出されました。
中間クラスの「Derived」のメソッドが呼び出されないように、SpecialDerivedクラスをどのように書き直すことができますか?
更新:
BaseではなくDerivedから継承したいのは、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.");
}
}