2017-02-21 66 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主构造是空的。否则,你必须像在第一个代码片段中那样显式调用构造函数。

放在一起,没有办法隐式调用构造函数。