我创建了一个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)
?
答案 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 SubClass2
和SubClass3
是等效的。
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
的主要构造函数为空。否则,您必须在第一个代码段中显式调用构造函数。
将它们组合在一起,就无法隐式调用构造函数。