Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala中的特征和抽象方法覆盖_Scala_Traits - Fatal编程技术网

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

Scala中的特征和抽象方法覆盖,scala,traits,Scala,Traits,我有一个基本抽象类(trait)。它有一个抽象方法foo()。它由几个派生类扩展和实现。我想创建一个可以混合到派生类中的trait,以便它实现foo(),然后调用派生类的foo() 比如: trait Foo { def foo() } trait M extends Foo { override def foo() { println("M") super.foo() } } class FooImpl1 extends Foo { override def

我有一个基本抽象类(trait)。它有一个抽象方法
foo()
。它由几个派生类扩展和实现。我想创建一个可以混合到派生类中的trait,以便它实现
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 

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

你非常接近。将抽象修饰符添加到M.foo,您就有了“Stackable Trait”模式:


如果我没有M怎么办?我试图在类中重写来自Foo的方法,但出现了相同的错误。
super.Foo()
当在超类中未实现Foo时,该怎么办?
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