2011-09-21 6 views
8

me gustaría usar el stackable trait pattern con objetos simples, pero me parece que no puede encontrar la manera de hacer que el compilador feliz:¿Se puede usar el patrón de rasgos apilables con objetos únicos?

abstract class Pr { 
    def pr() 
} 

trait PrePostPr extends Pr { 
    abstract override def pr() { 
    println("prepr") 
    super.pr() 
    println("postpr") 
    } 
} 

object Foo extends Pr with PrePostPr { 
    def pr() = println("Foo") 
} 

se trata de evaluar esto en el repl produce el siguiente error:

<console>:10: error: overriding method pr in trait PrePostPr of type()Unit; 
method pr needs `override' modifier 
     def pr() = println("Foo") 

Respuesta

13

Se puede, pero como esto:

abstract class Pr { 
    def pr() 
} 

trait PrePostPr extends Pr { 
    abstract override def pr() { 
    println("prepr") 
    super.pr() 
    println("postpr") 
    } 
} 

class ImplPr extends Pr { 
    def pr() = println("Foo") 
} 

object Foo extends ImplPr with PrePostPr 

La aplicación tiene que estar presente en una de las superclases/supertraits. El rasgo de modificación abstracta debe venir después de la clase/rasgo con la implementación en la lista de herencia.

+0

¡Ah, gracias por la explicación! – srparish

+0

Parece que está bien usar el mismo nombre, así que puedo nombrar la clase "Foo" y luego tener el objeto "Foo" extender la clase "Foo". – srparish

+0

Sí, lo es - en ese caso, el objeto 'Foo' se llama el objeto compañero de la clase' Foo'. – axel22

Cuestiones relacionadas