複数のグループ (レイヤー) を持つ汎用インターセプターで Scala のケーキ パターンを使用しようとしています。あるレイヤーの最後に別のレイヤーが必要な場合は、self タイプを使用してそれを表現しようとします。しかし、不正な継承で失敗します。タスクの一般的なコンテキストは、一連の検証を実行しようとしているドキュメント モデルを持っていることです。おもちゃの例では、各層が 1 つの特性だけで表されます。
trait Element
trait Leaf extends Element
trait Composed extends Element
trait Validator [A] {def validate (element : A) : String}
//second layer
trait LeafValidator extends Validator[Leaf]{
override def validate (element : Leaf) : String = "leaf"}
//first layer
trait ElementValidator extends Validator[Element]{
self : Validator[Leaf] =>
override def validate (element : Element) : String = element match {
case leaf : Leaf => super.validate(leaf)
case _ => "other"
}
}
case class Concrete extends LeafValidator with ElementValidator
エラーはインスタンス化行にあります
違法な相続; self-type apltauer.david.util.Concrete は apltauer.david.util.ElementValidator の selftype apltauer.david.util.ElementValidator と apltauer.david.util.Validator[apltauer.david.util.Leaf] Main.scala / Dependency/src/apltauer/david/util 行 56 Scala の問題
反変性はエラーを抑制しますが、self 型は役に立たないため、問題は解決しません。