有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

多态模式,以弥补Java中基于多态参数的运行时方法查找的不足?

Java似乎无法根据参数的运行时类型选择最合适的方法实现,如文档here所述。重述一下这个例子:

class Superclass {}
class Subclass extends Superclass {}
class Test {
    public void aMethod(Superclass s) {...}
    public void aMethod(Subclass s) {...}
}

执行测试类的哪个方法取决于引用的类型,而不是实例的类型。同样,根据链接的示例:

Test aTest = new Test();
Superclass aSuper = new Subclass();
test.aMethod(aSuper);

执行的是aMethod(Superclass s),而不是aMethod(Subclass s)

我试图在侦听器模式上创建一个变体,其中侦听器通过接口“插入”,并且侦听器具有为接口的子类定义的方法

举个简单的例子来说明我的意思,比如说我正在构建一个可以插入功能的闹钟

我想到的上面的实现看起来像一个接口Event,有一个子类WakeUpEvent,还有一个接口EventListener需要实现handle(Event evt)

我希望创建一个类来实现一个no ophandle(Event evt),如果监听器想要处理这种类型的事件,那么该类将使用一个特定的handle(WakeUpEvent evt)

当然,这种方法不会按原样工作-显而易见的解决方案是运行时instanceofchecks-yuk

是否有任何模式或方法可以用来获得我想要的行为


共 (4) 个答案

  1. # 1 楼答案

    访客模式是你需要的

  2. # 2 楼答案

    正如其他人所指出的,您可以使用访客模式

    然而,我鼓励你们考虑另一种方法,因为这一切对我来说似乎都是设计的味道

    aMethod不应该在超类中定义而不是在测试中定义吗?然后可以重写子类中的aMethod,并在运行时调用正确的版本

  3. # 3 楼答案

    当我想到访客或双重分派模式时,就会出现这种情况

  4. # 4 楼答案

    这不是一个直接的答案,而是一个理解问题的提示

    您所描述的是方法重载(在Test类中使用)和重写(用于描述通过实现EventListener然后重载handle来实现什么)的混淆组合

    这种行为的原因是重载导致编译时决定调用哪个方法。 因此,如果使用重载,最好使用互不兼容的参数类型,以避免这种混淆