这是一个复杂的问题需要解释,所以我做了一个糟糕的MSPaint diagram。
说我有一个Subclass对象列表。其中一些包含一个名为onEvent();
的方法。在我的onEvent();
里面来自一个完全不相关的类,我想遍历我的对象列表,如果它们存在则调用它们onEvent();
。显然,如果我尝试迭代Superclass类型的列表,它必须是一个抽象的方法来工作。我只想要一些子类来使用这个onEvent()方法。
我可能很难理解,但我希望你明白,任何想法都会受到赞赏。
答案 0 :(得分:0)
我认为你应该重新考虑你的班级设计。
您的问题有两种解决方案
将onEvent
方法作为非抽象方法提取到超类中,并使用空体。然后,您只能在适当的地方覆盖子类。
介绍一个接口 - 让我们称之为EventHandler
- 声明方法onEvent
。在适当的子类中实现此接口。然后将列表更改为EventHandler
个对象列表,或保持原样并使用instanceof
检查对象是否为迭代中的EventHandler
。
答案 1 :(得分:0)
在超类中:
// subclasses should override this if they want onEvent to be supported
public boolean isOnEventSupported() {
return false;
}
public final void onEvent() {
if (!isOnEventSupported()) {
throw new UnsupportedOperationException("onEvent is not supported");
}
doOnEvent();
}
protected void doOnEvent() {
// do nothing : subclasses should override this if they want onEvent to do something useful
}
答案 2 :(得分:0)
非常简单:
interface Listener {
void onEvent();
}
public class SuperClass {}
public class SubClass1 extends SuperClass implements Listener {
public void onEvent();
}
public class SubClass2 extends SuperClass {}
public class DifferentClass implements Listener {
private final List<SuperClass> objects;
public void onEvent() {
for (SuperClass o : objects) {
if (o instanceof Listener) {
((Listener)o).onEvent();
}
}
}
}
但至于我,你的设计有点凌乱。我不知道你的具体情况,但instanceof
的使用通常是糟糕设计的味道!
答案 3 :(得分:0)
最简单的解决方案是在超类中使onEvent
抽象化。然后在不支持它的子类上用空主体覆盖它。