9

私はこのようなことを達成しようとしています

public abstract class BaseEvent
{
    public abstract void Dispatch(IEventHandler handler);
}

public class MyEvent : BaseEvent
{
    public override void Dispatch(IMyEventHandler handler)
    {
        handler.OnMyEvent(this);
    }
}

public interface IEventHandler
{
}

public interface IMyEventHandler : IEventHandler
{
    void OnMyEvent(MyEvent e);
}

問題は、の代わりにを使用しているため、コンパイラMyEventが実装しないと文句を言うことです。他のタイプのイベントハンドラーを渡すような愚かなことをしていないことを確認するためにコンパイル時チェックをしたいので、それをにキャストさせたくありません。私は可能な解決策を見つけました(以下)が、これを行うためのより良い方法があるかどうか疑問に思っています。BaseEventDispatchIMyEventHandlerIEventHandlerMyEvent.DispatchIEventHandlerIMyEventHandler

public abstract class BaseEvent<H> where H : IEventHandler
{
    public abstract void Dispatch(H handler);
}

public class MyFirstEvent<H> : BaseEvent<H> where H : IMyFirstEventHandler
{
    public override void Dispatch(H handler)
    {
        handler.OnMyFirstEvent(this);
    }
}

public interface IEventHandler
{
}

public interface IMyFirstEventHandler : IEventHandler
{
    void OnMyFirstEvent<H>(MyFirstEvent<H> e) where H : IMyFirstEventHandler;
}

ありがとう、トム

4

3 に答える 3

8

私は以前あなたのアプローチを使用しました。

それは私にはかなり堅実に見えます。

于 2012-09-26T00:50:15.123 に答える
-3

MyEventは、抽象メソッドDispatchの署名を変更します。そのため、コンパイル時エラーが発生しました。

フォローコードはどうですか。

public class MyEvent : BaseEvent
{
    public override void Dispatch(IEventHandler handler)
    {
        if(!handler is IMyFirstEventHandler )throw new ArgumentException("message").
        ((IMyFirstEventHandler )handler).OnMyEvent(this);
    }
}
于 2012-09-26T00:52:48.190 に答える
-4

これは、オーバーライドと継承のヘルプと非常によく似ているようです。メソッドをオーバーライドしたい場合は、キーワード「virtual」が必要だと確信しています。

于 2012-09-26T01:11:22.080 に答える