2

我有一个特点:

trait A {
  /*Some methods*/
}

我有很多课:

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

我想从特质中得到一个论点。我可以在每个类和特征中创建方法 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

你可以有抽象的 val:

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 回答