IAction
私は1つのジェネリックメソッドを持つインターフェースを持っています:
public interface IAction {
void doAction(ISignal sig, IState state);
}
次に、別のクラスがインターフェイスをIActionAbstract
実装し、次の句IAction
を使用してオーバーロードされたメソッドを呼び出します。instanceof
public abstract class IActionAbstract implements IAction
{
@Override
public void doAction(ISignal sig, IState state)
{
if(sig instanceof ISignal1 && state instanceof IState1)
{
doOther((ISignal1)sig, (IState1)state);
}
else if(sig instanceof ISignal2 && state instanceof IState1)
{
doOther((ISignal2)sig, (IState1)state);
}
else if(sig instanceof ISignal1 && state instanceof IState2)
{
doOther((ISignal1)sig, (IState2)state);
}
}
abstract void doOther(ISignal1 sig, IState1 state);
abstract void doOther(ISignal2 sig, IState1 state);
abstract void doOther(ISignal1 sig, IState2 state);
}
チェックを削除しinstanceof
てジェネリックスに置き換えるか、再設計したいのですが、にメソッドを追加する必要はありませんIAction
。リフレクションでこれを行う方法はわかりますが、可能であれば避けたいと思います。
編集:ジェネリックは不要なので削除しました。このアプローチのより良いアイデアを与えるために、もっと説明しようと思います。このIActionAbstract
ファイルは、開発者がメソッドを実装するためのimplを作成して生成される場合があります。 ISignal
そしてIState
一緒にメソッドをユニークにし、ステートマシンの状態と信号と考えることができます。
クラスの使用法は、擬似コードのようになります。
List<IAction> actions;
actions.get(i).doAction(ISignal1, IState1);
actions.get(i).doAction(ISignal2, IState2);
and so on...