web-dev-qa-db-ja.com

特性と抽象メソッドは、Scala

基本抽象クラス(特性)があります。抽象メソッド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 

自己型と構造型を試しましたが、うまくいきません。

61
IttayD

あなたは非常に近かった。 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
97
retronym