2

私には特徴があります:

trait A {
  /*Some methods*/
}

そして、私はたくさんのクラスを持っています:

class B(val argument: SomeClass) extends A {
  /*Some methods*/
}

trait から引数を取得したい。各クラスとトレイトでメソッド getArgument を作成できます。

trait A {
  def getArgument: SomeClass
  /*Some methods*/
}
class B(val argument: SomeClass) extends A {
  def getArgument = argument
  /*Some methods*/
}

またはリフレクションを使用します。

trait A {
  def getArgument = {
    val f =  this.getClass.getDeclaredField("argument")
    f.setAccessible(true)
    f.get(this).asInstanceOf[SomeClass]
  }
  /*Some methods*/
}
class B(val argument: SomeClass) extends A {
  /*Some methods*/
}

それを行うためのより良い方法はありますか?

4

2 に答える 2

2

あなたは抽象的なvalsを持つことができます:

trait A {
  val argument: SomeClass
}

class B(val argument: SomeClass) extends A

valになるように制約する必要はありません。

trait A {
  def argument: SomeClass
}

class B(val argument: SomeClass) extends A

class C extends A {
  def argument : SomeClass = ....
}
于 2012-07-27T17:41:31.390 に答える
1

古い質問ですが、検索者のために...タイプを定義thisしてそのメンバーにアクセスできます。

class ArgContainer(val argument: SomeClass)

class B(argument: SomeClass) extends ArgContainer(argument) with A
class C(argument: SomeClass) extends ArgContainer(argument) with A

trait A {
  this: ArgContainer =>

  def print() = {
    println(this.argument)
  }
}

詳しくはこちらを参照してください`self`参照でscala traitを使用するには

于 2015-10-19T16:54:13.437 に答える