我正在尝试将 Scala 的蛋糕模式与具有多个组(层)的通用拦截器一起使用。当一层的末尾需要另一层时,我尝试使用 self 类型来表达。但它因非法继承而失败。该任务的一般背景是我有一个文档模型,我正在尝试在其上进行验证链。玩具示例如下,每一层仅由一个特征表示。
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 类型是无用的。