Traits and abstract methods override in Scala

45,448

You were very close. Add the abstract modifier to M.foo, and you have the 'Stackable Trait' pattern: http://www.artima.com/scalazine/articles/stackable_trait_pattern.html

trait Foo {
  def foo()
}

trait M extends Foo {
  abstract override def foo() {println("M"); super.foo()}
}

class FooImpl1 extends Foo {
  override def foo() {println("Impl")}
}

class FooImpl2 extends FooImpl1 with M
Share:
45,448
IttayD
Author by

IttayD

Updated on July 08, 2022

Comments

  • IttayD
    IttayD almost 2 years

    I have a base abstract class (trait). It has an abstract method foo(). It is extended and implemented by several derived classes. I want to create a trait that can be mixed into the derived classes so that it implements foo() and then calls the derived class's foo().

    Something like:

    trait Foo {
      def foo()
    }
    
    trait M extends Foo {
      override def foo() {
        println("M")
        super.foo()
      }
    }
    
    class FooImpl1 extends Foo {
      override def foo() {
        println("Impl")
      }
    }
    
    class FooImpl2 extends FooImpl1 with M 
    

    I tried self types and structural types, but I can't get it to work.