1

イベントタイプに基づいてさまざまなタイプ/量のデータを渡すことができるカスタムイベントをサポートするクラスを実装する必要があります。例えば、

イベントタイプAIでは、2つの文字列名を渡す必要があります。イベントタイプBIでは、3つの文字列名とdoubleを渡す必要があります。

私が見つけた2つのデザイン:

  1. 可能なすべてのデータのフィールドとメソッドを含むEventObjectの拡張(一部のイベントタイプに不要なフィールドは空白のままになります)。

    // event constructors
    public MyEvent(Object source, int type, String a, String b) {}
    
    public MyEvent(Object source, int type, String a, String b, String c, double d) {}
    
  2. EventInfoオブジェクトのパラメーターを含むEventObjectの拡張。EventInfoは、変更情報の基本クラスです。特定のイベントを発生させるメソッドは、必要な変更情報を含むEventInfoのサブクラスを渡します(リスナーはダウンキャストする必要があります)。

    // event constructors
    public MyEvent(Object source, int type, EventInfo info) {}
    
    // base class for event info
    public class EventInfo {}
    

これを実装するために他にどのような設計がありますか?それぞれの長所と短所は何ですか?

ありがとう。

4

2 に答える 2

1

一般的な設計の1つは、イベントクラスにマップを含めて、パラメーターとイベントタイプを表示するフィールドを保持することです。したがって、イベントインターフェイスは次のようになります。

public interface Event [
    public Object getParameter(String key);
    public void setParameter(String key, Object parameter);
    public String getType();
}

イベントハンドラークラスでは、getParameter()とgetType()を使用して、イベントのパラメーターとイベントタイプを取得できます。

于 2012-04-06T16:31:52.927 に答える
0

Scalaを試してみてもかまわないのであれば、これが「case」クラスが主に使用されるものです。それらを次のように定義します。

sealed trait SomeEvent
case class YourEvent( a: String, b: String ) extends SomeEvent
case class YourOtherEvent( a: String, b: String, c: String, d: Double  ) extends SomeEvent

次に、パターンマッチングにより、「イベントプロセッサ」でそれらを使用できます。

class EventProcessor extends Actor with ActorLogging {

  def receive = {

    case YourEvent( a: String, b: String ) =>

        // handle it    

    case YourOtherEvent( a: String, b: String, c: String, d: Double ) =>

        // handle it    

    case unknown => log.debug( "got an unknown event => " + unknown )
  }
}

の意味はわかりませんint typeが、それがイベントの型である場合は、代わりに型クラスにすることができます。

Object sourceおそらく、実際に返信できるようなものでsource: ActorRefあり、パラメーターとして渡す必要もありません(Scala / AKKAを使用している場合は、その参照を作成して保持します)。

    case YourEvent( a: String, b: String, c: String, d: Double ) =>

        // handle it
        ...
        //reply to sender (e.g. source)
        sender ! YourReply( ... )

上記の例では、AKKAのごく一部を使用していますが、ケースクラスのパターンマッチングはScala機能に組み込まれているため、使用する必要はありません。

あなたが解決している問題を見る別の方法として上記をとってください。

于 2012-04-06T16:44:47.993 に答える