In Scala, I've seen the constructs
trait T extends S
and
trait T { this: S =>
used to achieve similar things (namely that the abstract methods in S
must be defined before an instance may be created). What's the difference between them? Why would you use one over the other?
Self type annotations allow you to express cyclic dependencies. For instance:
trait A extends B
trait B { self: A => }
This is not possible with simple inheritance.