2017-02-21 119 views
0

我創建了一個Trait來將所有常見的ViewHolder屬性合併到一個地方。如何模仿scala特質中的構造函數參數?

trait MyHolder extends RecyclerView.ViewHolder { 
    def view: View = this.itemView 
} 

然後,我想用這種特質在我的課像這樣:

case class MyItemHolder(override val view: View, items: Array[String]) extends MyHolder 

不幸的是它給了我一個錯誤。

Not enough arguments for constructor ViewHolder: (x$1: android.view.View)android.support.v7.widget.RecyclerView.ViewHolder. 
[error] Unspecified value parameter x$1. 
[error] case class MyItemHolder(override val view: View, items: Array[String]) extends MyHolder 

我可以得到它與這個類定義編譯,但它似乎是多餘的。

case class MyItemHolder(override val view: View, items: Array[String]) extends RecyclerView.ViewHolder(view) with MyHolder 

我該如何擺脫RecyclerView.ViewHolder(view)

回答

0

您不能刪除構造函數RecyclerView.ViewHolder,因爲您必須告訴Scala如何調用超級構造函數。一般來說,你並不需要重寫構造函數的參數,但可以使用任意值:

class BaseClass(val x: Int) 
class SubClass1 extends BaseClass(3) 
// or 
class SubClass2(val y: Int) extends BaseClass(y) 
// or 
class SubClass3(override val x: Int) extends BaseClass(x) 

如前所述hereSubClass2SubClass3是等價的。

trait的特徵之一是,它沒有構造函數(用於保留單繼承)。 Additionaly延伸一個class一個trait意味着該trait可以僅在該類別或種類的這個子類中使用:

class BaseClass 
class OtherClass 
trait T extends OtherClass 
class OtherSubClass extends OtherClass 

class SubClass1 extends BaseClass with T // error: illegal inheritance; 
class SubClass2 extends T // okay* 
class SubClass3 extends OtherSubClass with T // okay 

SubClass2 *僅適用由於OtherClass主構造是空的。否則,你必須像在第一個代碼片段中那樣顯式調用構造函數。

放在一起,沒有辦法隱式調用構造函數。