java - 绕过多重继承限制的正确方法是什么?

标签 java android oop multiple-inheritance extends

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

考虑一个扩展此类的适配器类,它提供扩展 RecyclerView 的功能:

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

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

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

该类(class)恰好足够短,可以发布,以防万一它是相关的:

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 中扩展两个类。换句话说,您希望将这两个类的所有功能都带入您的类中。

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

最佳答案

我认为“正常”的答案是遵循众所周知的“更喜欢组合而不是继承”。意思是:不要使用继承来节省几行代码,只需将额外的功能放入专用类 X 和 Z 中,并让那些需要它的类创建 X 或 Z 的对象,并调用方法关于这些。

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

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

关于java - 绕过多重继承限制的正确方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40367673/

相关文章:

java - 正确使用VLCj

java - java字符串文字可以被垃圾收集吗?如果是,如何证明?

android - 如何在数字之间添加逗号

android - 在 Unity Android/iOS 中高效存储大量图像

java - 与 Java .equals() 方法相反?

java - JBOSS AS 5 的 JVM 6 内存设置如何?

android - 我的应用程序未使用 Ice Cream Sandwich 在市场上展示

C# 继承 : implements + extends

language-agnostic - 从编码风格的角度来看,循环类依赖是否不好?

oop - 为什么对象的类型是指向标记类型的指针,而不是标记类型?