java - 调用接口(interface)方法时避免向下转型

标签 java

好吧,我有一个愚蠢的时刻。

我希望能够做这样的事情

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/

相关文章:

java - 如何消除大尺寸java swing标签中的间隙

java - 如何从 "Event"对象获取发生此事件的对象?

java - 如何根据java 8中的匹配条件从2个不同的对象列表创建对象列表

java - Hibernate @Transactionl 错误

java - Double 类型的方法 Deposit(double) 未定义

java - 从文本文件中提取电话号码的正则表达式是什么

Java将负二进制转换回整数

java - Dropwizard 迁移 Liquibase 新变更集未迁移

java - 从 Java JTable 中删除多个项目

java - 从 Java 按名称加载 C++ 类