7

VB.NET には「影」というキーワードがあります。「Jedi」という基本クラスと、「Jedi」を継承する「Yoda」という派生クラスがあるとします。「Jedi」で「ForcePush」というメソッドを宣言し、それを「Yoda」でシャドウイングすると、「Yoda」クラスのインスタンスでメソッドを呼び出すときに、基本クラスの実装が無視され、派生クラスの実装が使用されます. ただし、最初に「Jedi」タイプとして宣言された「Yoda」のインスタンスがある場合、つまりDim j as Jedi = new Yoda()インスタンスで「ForcePush」メソッドを呼び出した場合、Jedi 実装が使用されます。

ここで、「ForcePush」メソッドが呼び出されたときに発生する「UsingForce」と呼ばれるイベントがあり、派生クラスでイベントをシャドウアウトするとします (これは、「Yoda」が宣言するインターフェイス「IForcePowers」を持っているためです)。このイベント)、各クラスはそれぞれのイベントを発生させます。

'Jedi' 型として宣言された 'Yoda' のインスタンスがあり (上記のように)、'Jedi' の 'UsingForce' イベントにイベント ハンドラーを配置すると、'ForcePush' メソッドが ' Yoda' クラス、このイベント ハンドラーに到達しますか?

4

1 に答える 1

3

VB.NET でキーワードを使用shadowsするということは、存在する継承階層の外部に存在するまったく新しいメンバーを宣言していることを意味します。これが、そのキーワード (および関連する慣行) が一般的に「臭い」と見なされる理由です (この特定の用語に反対する人もいますが、私はそれが非常に適切だと思います)。この「影を落とす」パターンの背後にある理由は何ですか? 通常、このアプローチは、必要なことを達成するために他に方法がない状況のために予約されています。メソッドの継承とオーバーライドはオプションではありませんでしたか?

いずれにせよ、下位クラスのイベントを「シャドウ アウト」する場合、いいえ、継承チェーンの上位にあるクラスがイベントを直接トリガーする方法はありません。

于 2009-09-08T03:01:57.067 に答える