我有一个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
并IState
共同使该方法独一无二,可以将其视为状态机状态和信号。
类的用法看起来像伪代码:
List<IAction> actions;
actions.get(i).doAction(ISignal1, IState1);
actions.get(i).doAction(ISignal2, IState2);
and so on...