Scala中的特征和抽象方法会覆盖

Itt*_*ayD 61 scala traits

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

就像是:

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 
Run Code Online (Sandbox Code Playgroud)

我尝试过自我类型和结构类型,但我无法让它工作.

ret*_*nym 97

你非常接近.将抽象修饰符添加到M.foo,并且您具有"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
Run Code Online (Sandbox Code Playgroud)

  • 当 foo 在超类中未实现时,`super.foo()` 会做什么? (2认同)