如何从父类调用子类的方法?

3
假设我有一个继承自父碎片(ParentFragment)的类ChildFragment。目的是让多个活动和碎片中的常用按钮由一个ParentFragment处理。
当用户按下刷新按钮时,它将调用ParentFragment中的refresh()函数。但是,实际下载文件的操作是由ChildFragment处理的,因为每个碎片具有不同的内容。因此,每当refresh()完成时,我希望这个ParentFragment调用子代中的某些内容。
我该怎么做?或者如果有更好的方法,也可以帮助一下。

在父类中放置一个虚拟的刷新并调用它,子类必须重写它。 - am.rez
1
你的意思是 abstract 而不是 virtual :) - Philippe A
4个回答

5
您需要在子片段中覆盖refresh方法。
public class PFragment extends Fragment{
  protected void refresh(){
    //Common stuff here
  }
}

在子类中重写refresh方法。
public class CFragment extends PFragment{
 public void onClick(){
  super.refresh();
 }

@Override
protected void refresh(){
 //Custom stuff here
}

}

但请注意,除非您在子类刷新方法中添加super.refresh(),否则不会执行父级刷新方法。 - Nibor
修改了答案。 - Dishonered

1

EventBus! - 简化组件之间的通信


1
class ParentFragment() {

    protected void refresh() {
        // general code when refresh every fragment
    }
}

class ChildFragment1 extend ParentFragment {
    @Override
    public void refresh() {
         super.refresh();
         // code for refresh child fragment1
    }
}

class ChildFragment2 extend ParentFragment {
    @Override
    public void refresh(); {
         super.refresh();
         // code for refresh child fragment2
    }
}

1
如果您不希望子类实现refresh并调用super.refresh,则在ParentFragment中为downloadFile方法定义一个抽象方法,然后在子类中实现此方法。
class ParentFragment {
    public void refresh() {
        downloadFile();
    }

    protected abstract void downloadFile();
}

class ChildFragment extends ParentFragment {
    @Override
    protected void downloadFile() {
        // do the download here
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接