基本メソッドを呼び出すときに中間オーバーライドを回避する方法
複数レベルのクラス階層を操作する場合、必要な状況が発生する可能性があります。オーバーライド メソッドから基本メソッドを呼び出すが、中間クラスの実装を呼び出したくない場合。この記事では、これを C# で実現する方法について説明します。
提供されたコード スニペットには、仮想メソッド Say() を持つ Base クラスがあります。派生クラスはこのメソッドをオーバーライドし、SpecialDerived はさらにこのメソッドをオーバーライドします。 SpecialDerived のインスタンスに対して sd.Say() を呼び出すと、独自の実装だけでなく Derived の実装も呼び出されることに気づきます。
Derived の実装が呼び出されないようにするには、base.base を使用できません。言う()。代わりに、次の 2 つのオプションがあります。
オプション 1: よく使用される実装を保護された仮想メソッドに移動する
複数の派生メソッドで共有する必要があるよく使用される実装がある場合クラスを作成した場合は、それらを基本クラスの保護された仮想メソッドに移動します。これにより、他のクラスは必要な実装のみをオーバーライドでき、中間クラスの実装の呼び出しを回避できます。
たとえば、Say() をオーバーライドする Derived の代わりに、保護された仮想メソッド CustomSay():
を導入できます。class Base { public virtual void Say() { Console.WriteLine("Called from Base."); } } class Derived : Base { public override void Say() { CustomSay(); base.Say(); } protected virtual void CustomSay() { Console.WriteLine("Called from Derived."); } } class SpecialDerived : Derived { protected override void CustomSay() { Console.WriteLine("Called from Special Derived."); } }
オプション 2: 関数ポインターの直接呼び出し (安全ではありません)アプローチ)
代わりに、安全でないコード ブロックを使用して、基本クラスのメソッドの関数ポインターを直接呼び出すことができます。このアプローチは安全でなく、潜在的なエラーにつながる可能性があるため、推奨されません。
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# でオーバーライドするときに中間クラス メソッド呼び出しを防ぐ方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。