Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/312.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/188.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java超类扩展_Java_Android_Inheritance - Fatal编程技术网

Java超类扩展

Java超类扩展,java,android,inheritance,Java,Android,Inheritance,我有一个关于这里所问问题的后续问题: 使用以下代码: public class SuperClass() {   boolean isDoneLoading = false; ArrayList items; public SuperClass() { loadData(); items = new ArrayList(); }   protected void loadData() { // loadData

我有一个关于这里所问问题的后续问题:

使用以下代码:

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”(ExtendedClass)
doneLoading()

如果你写:

ExtendedClass ec = new ExtendedClass();
loadData
将在超类中调用(在
ExtendedClass
中没有这样的方法),但是
doneLoading
将在
ExtendedClass
中调用。因此,不会调用超级类
doneLoading
方法,因为您已经重写了它

附:此评论:

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


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

如果你想让父级
完成读取
,然后是子级版本的例程,并且在父级中保留此功能,那么它们必须以不同的名称命名。例如:

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

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

超类中存在的Doneloading函数已被重写。您正在尝试调用重写的函数。如果调用super类的函数,重写似乎毫无意义。

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

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

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

谢谢:)这是今天讨论中提出的假设,我只需要一个对super类的方法的回调。在您的孩子的
doneLoading()
中调用
super
,与您的问题没有直接关系,但请看一下在构造函数中使用可重写方法调用可能出现的问题
loadData()
在构造函数中使用时应该是
private
。只是对代码约定的一点评论:
超类
扩展类
对于类来说并不是很好的名称,原因是类名也是它定义的对象类型的名称。显然,
超类的一个实例实际上不是任何东西的超类。在这种情况下,超类必须声明为抽象类。