既然我们在谈论理论,我指的是一些事实并从设计的角度来说话。
静态方法不与类的特定实例相关联,因此重写不是一种选择,因为它依赖于实例。我说的是 Java,因为我记得其他一些允许类方法覆盖的语言。
解决方法是在每个子类中定义一个静态方法来返回它感兴趣的事件,这样您就可以在实例化之前知道这些数据。
另一种选择是让一个特定的类负责这些对象的实例化,并使该类保留一个表,将事件与感兴趣的类列表(您可以初始化和配置的表)相关联。这种方法似乎更易于维护,因为如果您想从事件中取消订阅类,则不必更改代码。
最后,您只需实例化与某个事件关联的所有类:
public class EventClassCreator {
private Map<String, List<String>> subscriptions;
public EventClassCreator() {
subscriptions = new HashMap<String,Set<String>>();
}
public void addSubscription(String event, String class) {
if(subscriptions.containsKey(event))
subscriptions.get(event).add(class);
else {
Set<String> subscriptionsForEvent = new HashSet<String>();
subscriptionsForEvent.add(class);
subscriptions.put(event, subscriptionsForEvent);
}
}
//You just need to make an event that loops over the list of classes,
//checks a subscription and instantiates a class if it is in the
//proper list.
}