私は抽象基底クラス(Base
)にいくつかのスタッキング特性が定義されています(StackingTrait
)。スカラ:抽象基底クラスを持つTrait Mixin
trait Base {
def foo
}
trait StackingTrait extends Base {
abstract override def foo { super.foo }
}
次の構文を使用してサブクラスを実装するのに非常に便利であるが、コンパイラは、fooが、その後override
として宣言する必要があると言うので、これは動作しないため、無効である再コンパイル、上abstract override
とImpl
はクラスです。
class Impl extends Base with StackingTrait {
def foo {}
}
私は、このような構文が禁止されるだろう正当な理由を考えることができません。 fooは論理的にImpl
で定義されているため、概念的にスタッキングが発生する順序付けは同じです。
注: この回避策は効果的に私が望むのと同じことを実行するとわかりましたが、ヘルパークラスが必要なため、より良い解決策が必要になります。
class ImplHelper extends Base {
def foo {}
}
class Impl extends ImplHelper with StackingTrait
なぜ、目的の構文がコンパイルされず、優雅な解決策がありますか?
偉大な答え!このまさにこのシナリオについての質問を投稿しようとしていました。ありがとう! –
私もこの問題に遭遇しました。線形化はこれについて最終的には正しいですが、私は、形質を積み重ねるという現実世界の目的がこれであることを認識しました:共通の抽象クラス/形質の既存の具体的な実装にのみスタッキング特性を変更することができます。つまり'抽象クラスList'と' Mod Mod extends List'を持っています。あなたは単に 'class Foo extends Mod with List'を書くことはできません。まず 'class LinkedList extends List'のように具体的なListを持たなければならないので、' Class Bar extends Moded with LinkedList'を書くことができます。希望は意味をなさない。 –
忘れてしまいましたが、これは 'abstract override'メソッドの特徴だけが明確であることに関係しているということを忘れてしまいました。そのような方法がなければ、形質を自由に混在させることができるようです。 –