Reputation:
I have a trait:
trait A {
/*Some methods*/
}
And I have a lot of classes:
class B(val argument: SomeClass) extends A {
/*Some methods*/
}
I want to get an argument from trait. I can create method getArgument in each class and trait:
trait A {
def getArgument: SomeClass
/*Some methods*/
}
class B(val argument: SomeClass) extends A {
def getArgument = argument
/*Some methods*/
}
Or use reflection:
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*/
}
Are there any better ways to do that?
Upvotes: 2
Views: 759
Reputation: 1411
An old question, but for sake of searchers...
You can define type of this
and access its members:
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)
}
}
See more here How to use scala trait with `self` reference?
Upvotes: 1
Reputation: 29528
You can have abstract vals:
trait A {
val argument: SomeClass
}
class B(val argument: SomeClass) extends A
You need even not constraint it to be a val:
trait A {
def argument: SomeClass
}
class B(val argument: SomeClass) extends A
class C extends A {
def argument : SomeClass = ....
}
Upvotes: 2