2017-02-21 6 views
0

一般的なすべてのViewHolderプロパティを1つの場所に結合するための特性を作成しました。スカラー形質でコンストラクタ引数を模倣する方法は?

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のコンストラクタを削除することはできません。スペアにスーパーコンストラクタの呼び出し方法を伝える必要があるからです。一般的に、あなたは、コンストラクタのパラメータを上書きする必要はありませんが、任意の値を使用することができます。

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の特徴の1つは、コンストラクタ(単一継承を保持するため)がないことです。 classを拡張 Additionaly traitこのtraitは、そのクラスまたはそのサブクラスでのみ使用することができることを意味します* SubClass2

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 

OtherClassの主なコンストラクタが空のためにのみ機能します。それ以外の場合は、最初のコードスニペットのようにコンストラクターを明示的に呼び出す必要があります。

これをまとめると、コンストラクタを暗黙的に呼び出す方法がありません。

関連する問題