如何在scala特征中模仿构造函数参数?

时间:2017-02-21 10:23:44

标签: android scala inheritance traits

我创建了一个Trait,将所有常见的ViewHolder属性组合在一个地方。

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)

1 个答案:

答案 0 :(得分: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)

如上所述,here SubClass2SubClass3是等效的。

trait的一个特征是,它没有构造函数(用于保持单继承)。 另外,扩展trait的{​​{1}}意味着此class只能在该类或其子类中使用:

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的主要构造函数为空。否则,您必须在第一个代码段中显式调用构造函数。

将它们组合在一起,就无法隐式调用构造函数。