コードインスペクション: ポリモーフィックなフィールドのようなイベントの呼び出し
次のコードを考えてみましょう。
public class Base
{
public virtual event EventHandler MyEvent;
}
public class Derived : Base
{
public override event EventHandler MyEvent;
public void SomeMethod()
{
var args = ...;
MyEvent(this, args);
}
}
上記のコードブロックは、オーバーライドイベント宣言を使用して、イベントに対する add メソッドと remove メソッドの実装をオーバーライドします。 フィールド自体は、 Base と Derived の 2 つの別々のインスタンスに存在します。 その結果、 Derived で作業する場合、明示的に値を設定しない限り、 Base の MyEvent をインスタンス化することはありません。 その結果、基本クラスでイベントが発生した場合の動作は、派生クラスのイベントと異なります。
上記の状況を解決する最も簡単な方法は、オーバーライドを削除し、代わりに基本クラスでイベント起動メソッドを作成することです。 例えば:
public class Base
{
public event EventHandler MyEvent;
public void FireMyEvent(object sender, EventArgs args)
{
var e = MyEvent;
if (e != null)
e(sender, args);
}
}
public class Derived
{
public void SomeMethod()
{
var args = ...;
FireMyEvent(this, args);
}
}
2026 年 6 月 12 日