scalacompositiontraitsself-type

Difference between trait inheritance and self type annotation


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?


Solution

  • 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:

    trait FooService
    
    trait FooRemoting { this : FooService => }
    trait FooPersistence { this : FooService => }
    
    object Services extends FooService with FooRemoting with FooPersistence
    

    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:

    trait Iterator[T] {
      def hasNext : boolean
      def next : T
    }
    
    trait InfiniteIterator[T] extends Iterator[T] {
      def hasNext = true
    }