解决多重继承限制的正确方法是什么?

时间:2016-11-01 19:56:52

标签: java android oop multiple-inheritance extends

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

考虑一个扩展此类的适配器类,它提供了扩展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扩展两个类。换句话说,您希望将两个类的所有功能都带入您的班级。

解决此类案件的正确方法是什么?任何人都可以使用我在这里定义的类提供一个例子吗?

1 个答案:

答案 0 :(得分:2)

我认为“正常”的答案是遵循众所周知的“偏爱结构而不是继承”。在以下意义上:不要使用继承来保存几行代码,只需将额外的功能放入专用的类X和Z中,并让那些需要它的类创建一个X或Z的对象,并调用方法在那些。

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

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