0

ダブルディスパッチパターンを広範囲に使用するアルゴリズムを拡張する必要があります。

このアルゴリズムは、いくつかの異なるデータ クラス (多くのクラス) を操作し、各クラスには同じ拡張機能が必要です。

既存のデータ クラス (シリアライゼーションの問題を制限するため) もアルゴリズム クラス (回帰を制限するため) も変更したくありません。そこで、新しいクラスを使用してソリューションを設計しました。

次の例のようなものを使用したいのですが、Java は私の型を認識することを拒否します。

import Main.Data1;
import Main.ExtendedData;

public class Main
{
  static interface OperatorDispatcher
  {
    void dispatchDoSomething( OperatorDispatch operator );
  }

  static class Data1 implements OperatorDispatcher
  {
    @Override
    public void dispatchDoSomething( OperatorDispatch operator )
    {
      operator.doSomething( this );
    }    
  }

  static class Data2 implements OperatorDispatcher
  {
    @Override
    public void dispatchDoSomething( OperatorDispatch operator )
    {  
      operator.doSomething( this );
    }    
  }

  static interface OperatorDispatch
  {
    void doSomething( Data1 data );
    void doSomething( Data2 data );
  }

  static class MyOperator implements OperatorDispatch
  {
    public void doSomething( Data1 data1 )
    {
      System.out.println( "doSomething with Data1 : " + data1 );
    }

    public void doSomething( Data2 data2 )
    {
      System.out.println( "doSomething with Data2 : " + data2 );
    }
  }

  static interface ExtendedOperatorDispatch
  {
    void doSomething( Data1 data, Object extension );
    void doSomething( Data2 data, Object extension );
  }

  static class MyExtendedOperator implements ExtendedOperatorDispatch
  {
    public void doSomething( Data1 data1, Object extension )
    {
      System.out.println( "doSomething with Data1 : " + data1 + " and " + extension );
    }

    public void doSomething( Data2 data2, Object extension )
    {
      System.out.println( "doSomething with Data2 : " + data2 + " and " + extension );
    }
  }

  static interface ExtendedOperatorDispatcher extends OperatorDispatcher
  {        
    void dispatchDoSomething( ExtendedOperatorDispatch operator );
  }

  /*
   * I don't want to specialize this class for each data type.
   */
  static class ExtendedData< T > implements ExtendedOperatorDispatcher
  {
    T _data;
    Object _extension;

    public ExtendedData( T data, Object extension )
    {
      _data = data;
      _extension = extension;
    }

    @Override
    public void dispatchDoSomething( OperatorDispatch operator )
    {  
      /*
       * ERROR : The method doSomething(Main.Data1) in the type Main.OperatorDispatch is not applicable for the arguments (T)
       */
      operator.doSomething( _data );
    }

    @Override
    public void dispatchDoSomething( ExtendedOperatorDispatch operator )
    {  
      /*
       * ERROR : The method doSomething(Main.Data1, Object) in the type Main.ExtendedOperatorDispatch is not applicable for the arguments (T, Object)
       */
      operator.doSomething( _data, _extension );
    }    
  }

  public static void main( String[] args )
  {
    MyOperator operator = new MyOperator();

    Data1 data10 = new Data1();
    data10.dispatchDoSomething( operator );

    Data1 data11 = new Data1();
    data11.dispatchDoSomething( operator );

    Data2 data20 = new Data2();
    data20.dispatchDoSomething( operator );

    MyExtendedOperator extendedOperator = new MyExtendedOperator();

    ExtendedData< Data1 > extendedData10 = new ExtendedData< Data1 >( data10, "EXTENSION" );
    extendedData10.dispatchDoSomething( operator );
    extendedData10.dispatchDoSomething( extendedOperator );

    ExtendedData< Data2 > extendedData20 = new ExtendedData< Data2 >( data20, "EXTENSION" );
    extendedData20.dispatchDoSomething( operator );
    extendedData20.dispatchDoSomething( extendedOperator );    
  }  
}

それを修正する方法を知っているか、別の解決策を考えている場合は、遠慮なく答えてください。

ありがとう

4

1 に答える 1