我有了一個通用的方法的接口IAction
:重載方法調用的重新設計
public interface IAction {
void doAction(ISignal sig, IState state);
}
另一類IActionAbstract
然後實現與instanceof
條款的IAction
接口和調用重載方法:
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
一起使得該方法是獨特的,並且可以被認爲是狀態機狀態和信號。
類的使用看起來像在僞代碼:像你想IAction的不同實現
List<IAction> actions;
actions.get(i).doAction(ISignal1, IState1);
actions.get(i).doAction(ISignal2, IState2);
and so on...
您能否詳細說明僞代碼 - 最終的不同信號和狀態從哪裏來?另外,請提供ISignal和IState接口,以及可能的doOther方法的一些示例實現。 – claesv 2012-04-26 07:08:05
我結束了使用反射,由於我的一些生成和一些不需要,我的獨特情況,克拉斯夫感謝幫助確認我的選項。 – nibuen 2012-05-24 03:07:55