我有一个界面IAction
它有一个通用方法:
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
and IState
共同使得该方法独一无二,并且可以被认为是状态机状态和信号。
类的用法类似于伪代码:
List<IAction> actions;
actions.get(i).doAction(ISignal1, IState1);
actions.get(i).doAction(ISignal2, IState2);
and so on...