2011-09-21 16 views
8

mi piacerebbe utilizzare la stackable trait pattern con oggetti Singleton, ma io non riesco a trovare il modo di rendere il compilatore felice:È possibile utilizzare il modello del tratto impilabile con oggetti singleton?

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") 
} 

Cercando di valutare questa nel repl produce il seguente errore:

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

risposta

13

Si può, ma in questo modo:

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 

L'attuazione deve essere presente in una delle superclassi/supertraits. Il tratto di modifica astratta deve venire dopo la classe/tratto con l'implementazione nella lista di eredità.

+0

Ah, grazie per la spiegazione! – srparish

+0

Sembra che usi lo stesso nome, quindi posso dare un nome alla classe "Foo" e quindi avere l'oggetto "Foo" estendere la classe "Foo". – srparish

+0

Sì, lo è - in tal caso l'oggetto 'Foo' è chiamato l'oggetto complementare della classe' Foo'. – axel22

Problemi correlati