2010-01-10 53 views
54

我有一个基本的抽象类(特征)。它有一个抽象方法foo()。它由几个派生类扩展和实现。我想要创建一个可以混合到派生类中的特征,以便它实现foo(),然后调用派生类的foo()在Scala中重写特征和抽象方法

喜欢的东西:

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 

我试着自我类型和结构类型,但我不能得到它的工作。

回答

93

你非常接近。将摘要修饰符添加到M.foo中,并且您具有“可堆叠特征”模式: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 
相关问题