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?
I’d use self-types for dependency-management: This trait requires another trait to be mixed in. And I’d use inheritance to refine another trait or interface.
Just as an example:
Now, if FooRemoting and FooPersistence both would have inherited from FooService, and FooService has members and methods, how would Services look like?
Whereas for inheritance, we’d have something like: