我对此处提出的问题有一个后续问题:
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()
类?
答案 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函数已被覆盖。您正在尝试调用重写的函数。如果你调用超类的函数,覆盖似乎是无稽之谈。