Java超类扩展

时间:2012-09-15 22:29:39

标签: java android inheritance

我对此处提出的问题有一个后续问题:

Java Abstract Class (this keyword)

使用以下代码:

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();

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

4 个答案:

答案 0 :(得分:3)

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

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

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

答案 1 :(得分:2)

如果你写:

ExtendedClass ec = new ExtendedClass();

loadData将在超类中调用(ExtendedClass中没有此类方法),但doneLoading中将调用ExtendedClass。因此,不会调用超类doneLoading方法,因为您已覆盖它。

ps:这个评论:

  

loadData是一个从远程服务器

请求数据的类

让我觉得你在构造函数中做了太多东西。

答案 2 :(得分:1)

忽略你正在做的是好设计的问题,只需这样做:

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

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

答案 3 :(得分:0)

SuperClass中存在的Doneloading函数已被覆盖。您正在尝试调用重写的函数。如果你调用超类的函数,覆盖似乎是无稽之谈。