仮想メソッドのオーバーライド: 基本実装へのアクセス
オブジェクト指向環境では、クラスが仮想メソッドをオーバーライドすると、それが共通のメソッドになります。元の実装にアクセスする方法に関する質問です。
次のことを検討してください。 code:
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... } }
目標は、クラス B のスコープからクラス A の X メソッドを呼び出すことです。ただし、仮想メソッドをオーバーライドするときのデフォルトの動作は、派生クラスの実装を置き換えることです。
基本実装へのアクセス
C# では、残念ながら次のことはできません。オーバーライドされたメソッドの外部から基本メソッド実装に明示的にアクセスします。これは、仮想メソッドのディスパッチ メカニズムが呼び出しを B のオーバーライドされた実装に動的にバインドするためです。
代替アプローチ
基本実装へのアクセスが重要な場合は、考慮に値する設計上の欠陥。この機能は仮想メソッドの目的に合わない可能性があるため、非仮想メソッドで実装する必要がある可能性があります。
または、オーバーライドされたメソッド自体内で基本実装を呼び出すこともできます:
class B : A { override void X() { base.X(); Console.WriteLine("y"); } }
ただし、このメソッドの呼び出しは、派生クラスのオーバーライドされたスコープ内に限定されますmethod.
さらなる探索
C# には基本実装にアクセスする直接メソッドが提供されていませんが、リフレクションや IL の使用など、考慮すべき代替アプローチがあります。この動作を実現するための (中間言語) 操作。
以上がC# の派生クラスから基本クラスの仮想メソッド実装にアクセスするにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。