从特质中获取一个类字段

时间:2012-07-27 17:23:35

标签: scala

我有一个特点:

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*/
}

有没有更好的方法呢?

2 个答案:

答案 0 :(得分:3)

你可以有抽象的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 = ....
}

答案 1 :(得分: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)
  }
}

在此处查看更多How to use scala trait with `self` reference?