2011-09-21 33 views
8

Tôi muốn sử dụng stackable trait pattern với các đối tượng singleton, nhưng tôi dường như không thể tìm thấy làm thế nào để làm cho trình biên dịch hạnh phúc:Mẫu có thể xếp chồng có thể xếp chồng được sử dụng với các đối tượng đơn lẻ không?

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

Đang cố gắng để đánh giá này trong repl sản xuất các lỗi sau:

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

Trả lời

13

Nó có thể, nhưng như thế này:

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 

việc thực hiện đã có mặt tại một trong những superclasses/supertraits. Đặc điểm sửa đổi trừu tượng phải đến sau lớp/đặc điểm với việc thực hiện trong danh sách thừa kế.

+0

Ah, cảm ơn lời giải thích! – srparish

+0

Có vẻ như nó là tốt để sử dụng cùng một tên, vì vậy tôi có thể đặt tên cho lớp "Foo" và sau đó có đối tượng "Foo" mở rộng lớp "Foo". – srparish

+0

Vâng, đó là - trong trường hợp đó đối tượng 'Foo' được gọi là đối tượng đồng hành của lớp' Foo'. – axel22

Các vấn đề liên quan