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
。只是对代码约定的一点评论:超类
和扩展类
对于类来说并不是很好的名称,原因是类名也是它定义的对象类型的名称。显然,超类的一个实例实际上不是任何东西的超类。在这种情况下,超类必须声明为抽象类。