ダブルディスパッチパターンを広範囲に使用するアルゴリズムを拡張する必要があります。
このアルゴリズムは、いくつかの異なるデータ クラス (多くのクラス) を操作し、各クラスには同じ拡張機能が必要です。
既存のデータ クラス (シリアライゼーションの問題を制限するため) もアルゴリズム クラス (回帰を制限するため) も変更したくありません。そこで、新しいクラスを使用してソリューションを設計しました。
次の例のようなものを使用したいのですが、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 );
}
}
それを修正する方法を知っているか、別の解決策を考えている場合は、遠慮なく答えてください。
ありがとう