好吧,我有一个愚蠢的时刻。
我希望能够做这样的事情
class Example {
public State currentState;
}
interface State{}
interface StateCallbacks
{
public void onState(IdleState state);
public void onState(ContactingState state);
public void onState(SuccessState state);
public void onState(FailedState state);
}
并能够调用 onState(exampleInstance.currentState))
并调用正确的方法。
现在我知道为什么不能这样做,因为没有人保证 State
的所有无限可能子类都存在 onState
方法。
我的问题是,在没有 instanceOf
运算符的情况下,什么是实现类似目标的好方法。例如,我可以只包含一个 onState(State)
方法,但是实现者最终会使用 instanceOf
。
想法是 View 对象将实现回调接口(interface)并根据传递的状态放入 View 操作逻辑。每个状态都可能关联复杂的元数据。
据我所知,它可以通过支持事件和/或订阅者继承的事件总线来完成,但仅取决于这些事情如何工作的性质,并且 EventBus 不关心是否没有定义用于处理特定事件的事件处理方法,不像我们的 friend 编译器。
我知道这是一个简单的问题,但问题是,我也很简单。
非常感谢任何建议:)
最佳答案
这通常可以通过使用 visitor pattern 来解决。 .
按如下方式实现它:
interface State {
void accept(StateCallbacks visitor);
}
然后在所有 State.accept
实现中执行 visitor.onState(this)
,例如 IdleState
将如下所示:
public class IdleState implements State {
...
void accept(StateCallbacks visitor) {
visitor.onState(this);
}
}
(请注意,您所说的 StateCallbacks
在访问者模式中通常称为 StateVisitor
。)
然后您可以调用正确的方法,比如说,
exampleInstance.currentState.accept(new StatePrinter());
如果您想对当前状态进行一些自定义打印。
关于java - 调用接口(interface)方法时避免向下转型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26221738/