我有一个特点:
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*/
}
有没有更好的方法呢?
答案 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)
}
}