2016-11-01 117 views
0

我覺得每次我提問這樣的問題時,人們總是問代碼,但是我發佈了代碼,沒有人再次迴應,因爲我猜代碼太長了。所以這次我會盡量簡短。解決多繼承限制的正確方法是什麼?

考慮一個適配器類擴展此類,這對於擴大RecyclerViews提供的功能:

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

不過,我通常有另一個單獨的適配器類(即我試圖使自己),對添加複選框提供的功能RecyclerView項目/提供多選。用法示例:

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

該類恰好足夠短後,以防萬一它是relelvant:

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

考慮使用組合而不是繼承。 – bradimus

+0

你能否提供一個使用上面我寫的類定義的例子? – user7086932

回答

2

我認爲「正常」的答案是遵循着名的「偏好構成而不是繼承」。在下面的意義上:不要使用繼承來保存幾行代碼,只需將這些額外的功能放入專用類X和Z中,並讓那些需要它的類創建一個X或Z對象,然後調用方法在那些。

但事情是:你被「塞進」Android編程模型。而我認爲在這種情況下你沒有簡單的解決方案。除非你找到一個方法來

  1. 創建一個擴展適配器
  2. 「通用」的基類,但你可以給多個可能被用來行爲「添加」到適配器方法對象
+0

你可以舉一個例子,你是什麼意思的「給多個對象」,「添加行爲」?不必是實際的工作代碼,只需僞空碼即可顯示您的意思。 – user7086932

+0

對不起,我的答案是一個「有點」不具體的原因 - 我自己並沒有太多的Android模型。我將不得不深入研究正在使用的類的javadoc,以確定需要進入通用界面的那些部分。然後人們必須想出如何合理地實施這些方法。長話短說:這是一個有趣的話題,但我認爲這是可以在1小時內回答的問題之一......有5位經驗豐富的同事在同一個會議室進行討論。換句話說:一些不能「真正」用50或100行文字回答的問題 – GhostCat

+0

我可以告訴你,兩者之間唯一的共享組件就是ViewHolder創建/綁定方法。 – user7086932

相關問題