Using scala constructor to set variable defined in trait

36,418

Solution 1

Bar must define the abstract var foo in Foo (would be the same for a val). This can be done in the constructor

class Bar(var foo: String) extends Foo{...}

(of course, it could be done in the body of Bar too). By default, constructor parameters will be turned to private val if need be, that is if they are used outside the initiailization code, in methods. But you can force the behavior by marking them val or var, and possibly control the visibility as in

class X(protected val s: String, private var i: Int)

Here you need a public var to implement Foo.

Solution 2

trait Foo { var foo: String = _ }
class Bar(foo0: String) extends Foo { foo = foo0 }

The trait declares an uninitialized var; the class then sets it equal to the input parameter.

Alternatively,

trait Foo {
  def foo: String
  def foo_=(s: String): Unit
}
class Bar(var foo: String) extends Foo {}

declares the getter/setter pair corresponding to a foo, which are set by the class.

Share:
36,418

Related videos on Youtube

Seba Kerckhof
Author by

Seba Kerckhof

Updated on July 09, 2022

Comments

  • Seba Kerckhof
    Seba Kerckhof almost 2 years

    If I understand correctly, traits are the closest thing to Java interfaces and class constructors automatically set the variables.

    But what if I have a class that extends a trait and has a constructor which sets a variable from the trait, so something like:

    trait Foo {
        var foo: String
    }
    
    class Bar (foo: String) extends Foo { /* ... */ }
    

    Where I want the foo string of the trait been set when I make a Bar object.

    The compiler seems to give me errors about this. What is the correct way to achieve this?

    • CheatEx
      CheatEx over 12 years
      Just a note: trait initialization is't a simple thing itself and with variables and overriding you can complect initialization very quickly (I did). Make sure, that you really need it.