通过遍历子类重写类的方法

时间:2014-01-11 11:47:21

标签: java inheritance methods subclass superclass

这是一个复杂的问题需要解释,所以我做了一个糟糕的MSPaint diagram

enter image description here

说我有一个Subclass对象列表。其中一些包含一个名为onEvent();的方法。在我的onEvent();里面来自一个完全不相关的类,我想遍历我的对象列表,如果它们存在则调用它们onEvent();。显然,如果我尝试迭代Superclass类型的列表,它必须是一个抽象的方法来工作。我只想要一些子类来使用这个onEvent()方法。

我可能很难理解,但我希望你明白,任何想法都会受到赞赏。

4 个答案:

答案 0 :(得分:0)

我认为你应该重新考虑你的班级设计。

您的问题有两种解决方案

  1. onEvent方法作为非抽象方法提取到超类中,并使用空体。然后,您只能在适当的地方覆盖子类。

  2. 介绍一个接口 - 让我们称之为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抽象化。然后在不支持它的子类上用空主体覆盖它。