user1032985
user1032985

Reputation:

Get a class field from trait

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

Answers (2)

Sasha
Sasha

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

Didier Dupont
Didier Dupont

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

Related Questions