2010-01-10 39 views
54

Tôi có một lớp trừu tượng cơ sở (đặc điểm). Nó có một phương thức trừu tượng foo(). Nó được mở rộng và được thực hiện bởi một số lớp dẫn xuất. Tôi muốn tạo ra một đặc điểm có thể được trộn vào các lớp thừa kế sao cho nó thực hiện foo() và sau đó gọi các lớp có nguồn gốc của foo().đặc điểm và phương pháp trừu tượng ghi đè trong Scala

Cái gì như:

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 

tôi đã cố gắng loại tự và các loại cấu trúc, nhưng tôi không thể có được nó để làm việc.

Trả lời

93

Bạn đã tiến rất gần. Thêm công cụ sửa đổi trừu tượng vào M.foo và bạn có mẫu '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 
Các vấn đề liên quan