2016-11-01 8 views
0

私はこれらの質問をするたびに気分がいいです。人々は常にコードを要求しますが、コードを投稿するとコードが長すぎると思いますので誰も返信しません。だから私は今回は簡潔にしようとします。マルチ継承の制限を回避する正しい方法は何ですか?

RecyclerViewsを拡大するための機能を提供し、このクラス、拡張アダプタクラス考えてみましょう:私は通常、別の、独立したアダプタクラス(私は自分自身を作ってみましたという)にチェックボックスを追加するための機能を提供することがありますが

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

をRecyclerアイテムの表示/複数選択の提供。使用例:

クラスは、それはrelelvantです念のため、投稿するために十分に短いことを起こる
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では2つのクラスを拡張することはできません。言い換えれば、両方のクラスのすべての機能がクラスに持ち込まれることを望みます。

このようなケースを解決する正しい方法は何ですか?誰でも私がここで定義したクラスを使用した例を提供できますか?

+1

継承の代わりに合成を使用することを検討してください。 – bradimus

+0

上記のクラス定義を使用した例を提供できますか? – user7086932

答えて

2

「通常の」答えは、よく知られている「継承よりも優先する構成」に従うことだと思います。コードのいくつかの行を保存するために継承を使用せず、その余分なビットを専用のクラスXとZに入れ、必要なクラスにXまたはZのオブジェクトを作成し、メソッドを呼び出すそれらに。

しかし、事は:あなたはAndroidプログラミングモデルに「詰め込まれている」ということです。そして私はと思うと、その文脈であなたのための簡単な解決策がないと考えてください。あなたは、アダプタに

  • を拡張し、「一般的な」基底クラスを作成

    1. への道を見つけることができますが、複数にアダプタメソッドに振る舞いを「追加」するために使用することができオブジェクトを与えることができない限り
  • +0

    「複数のオブジェクトを与える」ことが「行動を追加する」という意味の例を挙げることはできますか?実際の作業コードである必要はありません。あなたが意味することを示す疑似エアコードです。 – user7086932

    +0

    申し訳ありませんが、私の答えは、 "ビット"な理由で非特異的です - 私はあまりAndroidモデルに自分自身ではないです。私は、使用しているクラスのjavadocを掘り下げて、共通のインタフェースに入る必要がある部分を特定する必要があります。次に、それらの方法を合理的に実装する方法を理解しなければなりません。長い話が短いです:これは興味深い話題ですが、これは1時間以内に回答できる質問の1つと考えています...同じ部屋にいる5人の経験豊かな方々とのディスカッションがあります。言い換えれば、50行または100行のテキストで「本当に」答えられないもの – GhostCat

    +0

    2つの間の唯一の共有コンポーネントは、ViewHolderの作成/バインディング方法であると言えます。 – user7086932

    関連する問題