2010-01-10 19 views
54

Tengo una clase abstracta base (rasgo). Tiene un método abstracto foo(). Es extendido e implementado por varias clases derivadas. Quiero crear un rasgo que pueda mezclarse en las clases derivadas para que implemente foo() y luego llame al foo() de la clase derivada.Anulación de los rasgos y los métodos abstractos en Scala

Algo así como:

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 

me trató tipos de auto y tipos estructurales, pero no puedo conseguir que funcione.

Respuesta

93

Estabas muy cerca. Agregue el modificador abstracto a M.foo, y tiene el patrón 'Stackable Trait': 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 
Cuestiones relacionadas