ホームページ > バックエンド開発 > C++ > C# 継承で「base.base.method()」を呼び出すと予期しない結果が生じるのはなぜですか?また、それを回避するにはどうすればよいですか?

C# 継承で「base.base.method()」を呼び出すと予期しない結果が生じるのはなぜですか?また、それを回避するにはどうすればよいですか?

Mary-Kate Olsen
リリース: 2024-12-28 04:38:09
オリジナル
639 人が閲覧しました

Why Does Calling `base.base.method()` Produce Unexpected Results in C# Inheritance, and How Can It Be Avoided?

base.base.method() の呼び出し

このコードには、SpecialDerived が Derived から継承するクラス階層があります。 Base から継承します。各クラスには、どのクラスから呼び出されたかを示すメッセージを出力する、オーバーライドされた Say() メソッドがあります。

Main() メソッドで sd.Say() が呼び出されると、次の出力が期待されます。

Called from Special Derived.
Called from Derived.
Called from Base.
ログイン後にコピー

ただし、実際の出力には Derived.Say() への予期しない呼び出しが含まれています。

これを防ぐために、次のように変更できます。 SpecialDerived クラスは、Say() をオーバーライドする代わりに CustomSay() メソッドを使用します。この方法では、sd.Say() が呼び出されたときに CustomSay() メソッドのみが呼び出されます。

class SpecialDerived : Derived
{
    protected override void CustomSay()
    {
        Console.WriteLine("Called from Special Derived.");
    }
}
ログイン後にコピー

別の回答で説明されている別の方法は、次の方法を使用して Base の Say() メソッドに直接アクセスすることです。反映:

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()」を呼び出すと予期しない結果が生じるのはなぜですか?また、それを回避するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート