【问题标题】:What's the correct way to get around the multi-inheritance restriction?绕过多继承限制的正确方法是什么?
【发布时间】:2016-11-01 19:56:52
【问题描述】:

我觉得每次我问这样的问题时,人们总是要代码,但后来我发布了代码,没有人再次回复,因为我猜代码太长了。所以这次我会尽量简明扼要。

考虑一个扩展这个类的适配器类,它提供了扩展 RecyclerViews 的功能:

public class MyAdapter extends ExpandableRecyclerViewAdapter<MyParentViewHolder, MyChildViewHolder> ...

但是,我通常有另一个单独的适配器类(我尝试自己制作),它提供了向 RecyclerView 项目添加复选框/提供多选功能的功能。用法示例:

public class MyOtherAdapter extends CheckableAdapter<SomeType, SomeViewHolder> ...

该课程恰好足够短,可以发布,以防万一:

public abstract class CheckableAdapter<T extends CheckableObject, VH extends CheckableViewHolder> extends RecyclerView.Adapter<VH> {
    private List<T> list;
    private boolean checkMode;

    public CheckableAdapter(List<T> list) {
        this.list = list;
        this.checkMode = false;
    }

    @Override
    public void onBindViewHolder(VH holder, int position) {
        final CheckableObject checkableObject = list.get(position);
        holder.checkBox.setOnCheckChangedListener( ... );
        if (isCheckModeOn()) {
            ...
        } else {
           ...
        }
    }

    public boolean getCheckMode() { return checkMode; }
    public void setCheckMode(boolean checkMode) { this.checkMode = checkMode; }
}

好的,现在考虑一种情况,您需要同时扩展 ExpandableRecyclerViewAdapter 和 CheckableAdapter,但您不能在 Java 中扩展两个类。换句话说,您希望将这两个类的所有功能都带入您的类中。

解决此类案件的正确方法是什么?谁能提供一个使用我在这里定义的类的例子?

【问题讨论】:

  • 考虑使用组合而不是继承。
  • 你能提供一个使用我上面写的类定义的例子吗?

标签: java android oop multiple-inheritance extends


【解决方案1】:

我认为“正常”的答案是遵循众所周知的“优先组合胜过继承”。从某种意义上说:不要使用继承来节省几行代码,只需将多余的功能放入专用的类 X 和 Z 中,并让需要它的类创建 X 或 Z 的对象,并调用方法那些。

但问题是:你被“塞进”了 Android 编程模型。我认为在这种情况下没有简单的解决方案。除非你找到办法

  1. 创建一个扩展 Adapter 的“通用”基类
  2. 但是您可以提供多个对象,这些对象可用于向适配器方法“添加”行为

【讨论】:

  • 你能举一个例子来说明“给多个对象”到“添加行为”是什么意思吗?不一定是实际的工作代码,只是伪空气代码来说明你的意思。
  • 抱歉,我的回答“有点”不具体,原因是我自己对 Android 模型并不太感兴趣。我将不得不深入研究您正在使用的类的 javadoc,以确定需要进入公共接口的那些部分。然后必须弄清楚如何合理地实现这些方法。长话短说:这是一个有趣的话题,但我认为这是可以在 1 小时内回答的问题之一……5 位经验丰富的人在同一个房间进行讨论。换句话说:不能“真正”用 50 或 100 行文本回答的问题
  • 我可以告诉你,两者之间唯一共享的组件是 ViewHolder 创建/绑定方法。
猜你喜欢
  • 2011-03-13
  • 2023-04-09
  • 2016-11-21
  • 1970-01-01
  • 2021-07-12
相关资源
最近更新 更多