2

我对这里提出的问题有一个后续问题:

Java 抽象类(this 关键字)

使用以下代码:

public class SuperClass() {
    boolean isDoneLoading = false;
    ArrayList items;
   public SuperClass() {
        loadData();
        items = new ArrayList();
    }
 
    protected void loadData() {
        // loadData is a class that requests data from remote server, populates "items"
        // and then calls doneLoading when done;

    }
    protected void doneLoading() {
        isDoneLoading = true;
    }
}

public class ExtendedClass extends SuperClass {

   public ExtendedClass() {
        super();    
   }
    protected void doneLoading() {
        // how can I get THIS method to be called when the super's doneLoading is called?
    }
}

// some other class
new ExtendedClass();

doneLoading()调用 super 的 doneLoading 类时, 如何获取“child”(ExtendedClass)类?

4

4 回答 4

3

如果您希望parent doneLoading后跟子版本的例程,但在parent中保留此功能,则它们必须以不同的方式命名。例如,

public abstract class SuperClass {
    public void doneLoading() {
       isDoneLoading();
    }
    abstract isDoneLoading();
}

另一个选项将责任委托给孩子调用super.doneLoading()

于 2012-09-15T22:45:03.673 回答
2

如果你写:

ExtendedClass ec = new ExtendedClass();

loadData将在超类中调用(在 中没有这种方法ExtendedClass),但doneLoading会在 中调用ExtendedClass。所以超类doneLoading方法不会被调用,因为你已经覆盖了它。

ps:这条评论:

loadData 是一个从远程服务器请求数据的类

让我觉得你在构造函数中做了太多的事情。

于 2012-09-15T22:35:48.017 回答
1

忽略您所做的是否是好的设计的问题,只需执行以下操作:

class ExtendedClass {
    protected void doneLoading() {
        super.doneLoading();
        // what needs to be called after SuperClass.doneLoading();
    }
}

另一种选择是使用观察者模式。(或者可能是责任链。)基本上让添加处理步骤的子类为超类发出的“完成加载”事件注册侦听器。

于 2012-09-15T22:45:49.897 回答
0

超类中存在的完成加载功能已被覆盖。您正在尝试调用被覆盖的函数。如果调用超类的函数,重写似乎是无稽之谈。

于 2012-09-15T22:45:36.390 回答