【问题标题】:How to mimic constructor arguments in a scala trait?如何在 scala 特征中模仿构造函数参数?
【发布时间】:2017-02-21 10:23:44
【问题描述】:

我创建了一个 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)

【问题讨论】:

    标签: android scala inheritance traits


    【解决方案1】:

    您不能删除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 的一个特点是它没有构造函数(用于保持单一继承)。 另外一个扩展了classtrait 意味着这个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 的主构造函数为空时才有效。否则,您必须像在第一个代码 sn-p 中那样显式调用构造函数。

    综上所述,没有办法隐式调用构造函数。

    【讨论】:

      猜你喜欢
      • 2015-06-06
      • 1970-01-01
      • 1970-01-01
      • 2011-06-24
      • 2013-09-08
      • 2011-07-16
      • 1970-01-01
      • 2013-03-16
      • 1970-01-01
      相关资源
      最近更新 更多