次の抽象イベントを持つ抽象基本クラスがあります
public abstract class SignalWrapperBase<T> : IReadOnlySignal<T> {
public abstract event Action<IReadOnlySignal<T>, Sample<T>> Updated;
...
}
私の実装では、私は単に言う
public class ValueChangedSignal : SignalWrapperBase<T> {
public override event Action<IReadOnlySignal<T>, Sample<T>> Updated;
...
}
そして、実装ValueChangedSignal
で次のことを実行しようとすると
if (Updated != null) { Updated(this, sample); }
ReSharper の警告: Invocation of polymorphic field-like event が表示されます。
その背後にある理由を確認しましたが、例では使用してvirtual
いません。abstract
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 メソッドの実装をオーバーライドしています。フィールド自体は、ベースと派生の 2 つの個別のインスタンスに存在します。結果として、Derived を使用する場合、明示的に何らかの値に設定しない限り、Base の MyEvent をインスタンス化することはほとんどありません。その結果、基底クラスと派生クラスでイベントが発生した場合の動作が異なります。
の場合、2 つのインスタンスが得られることがわかりますvirtual
。私は実際の実装で基本実装を隠しますが、私が使用するとき、abstract
私は決して基本実装を作成していませんよね? あるフィールドで抽象を使用すると、実装を継承クラスに転送するだけだと思いました。つまり、基本クラスのユーザーに抽象コードを実装するように要求しています。
ReSharper は間違った警告を出していますか? それとも私は何かを誤解していますか?