【发布时间】:2012-12-03 20:00:27
【问题描述】:
假设我有:
class Event {}
class DoorBell extends Event {}
class PhoneCall extends Event {}
class EventGenerator {
static Event getEvent() {
if (today.isSunday())
return new DoorBell()
else
return new PhoneCall();
}
}
class EventHandler {
void HandleEvent(DoorBell doorBell) { answer door; }
void HandleEvent(PhoneCall phoneCall) { answer phone; }
void consumeEvent() {
Event e = EventGenerator.getEvent();
HandleEvent(e);
}
}
HandleEvent(e) 无法编译,因为 HandleEvent(Event) 未定义。有解决方案吗?还是我得问一下这是什么活动?
【问题讨论】:
-
看来,您正在尝试重新发明代数数据类型和模式匹配。您的“void HandleEvent”只是静态重载,由静态类型信息调度,因此它们不适合。对于所需的行为,您应该使用“is”询问 Event 的类型,或者使用一些重量级的调度模式,如访问者。还可以考虑切换到 Scala。
-
听起来像是访问者模式的工作。我最近尝试回答similar question,也许它包含一些有趣的想法,可能不是答案,但值得考虑。
标签: java inheritance covariance contravariance