2011-09-21 14 views
8

Chciałbym użyć stackable trait pattern z pojedynczych obiektów, ale nie wydaje się znaleźć sposób, aby kompilator szczęśliwa:Czy wzór pojedynczej cechy może być używany z obiektami 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") 
} 

Próbując ocenić to w repl produkuje następujący błąd:

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

Odpowiedz

13

to możliwe, ale tak:

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 

realizacja musi być obecny w jednym z nadrzędnych/supertraits. Abstrakcyjna cecha modyfikacji musi nadejść po klasie/ciele z implementacją na liście dziedziczenia.

+0

Ah, dzięki za wyjaśnienie! – srparish

+0

Wydaje się, że dobrze jest używać tej samej nazwy, więc mogę nazwać klasę "Foo", a następnie obiekt "Foo" przedłużyć klasę "Foo". – srparish

+0

Tak, jest - w takim przypadku obiekt 'Foo' jest nazywany obiektem towarzyszącym klasy' Foo'. – axel22

Powiązane problemy