多态模式,以弥补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)
当然,这种方法不会按原样工作-显而易见的解决方案是运行时instanceof
checks-yuk
是否有任何模式或方法可以用来获得我想要的行为
# 1 楼答案
访客模式是你需要的
# 2 楼答案
正如其他人所指出的,您可以使用访客模式
然而,我鼓励你们考虑另一种方法,因为这一切对我来说似乎都是设计的味道
aMethod不应该在超类中定义而不是在测试中定义吗?然后可以重写子类中的aMethod,并在运行时调用正确的版本
# 3 楼答案
当我想到访客或双重分派模式时,就会出现这种情况
# 4 楼答案
这不是一个直接的答案,而是一个理解问题的提示
您所描述的是方法重载(在
Test
类中使用)和重写(用于描述通过实现EventListener
然后重载handle
来实现什么)的混淆组合这种行为的原因是重载导致编译时决定调用哪个方法。 因此,如果使用重载,最好使用互不兼容的参数类型,以避免这种混淆