我試圖使用斯卡拉的蛋糕模式與通用攔截器與多組(層)的那些。當一個圖層的末尾需要另一個圖層時,我嘗試使用自我類型來表示該圖層。但是它違反了非法繼承。該任務的一般背景是我有一個文檔模型,我正在試圖進行驗證鏈。玩具示例如下,每層僅由一個特徵表示。斯卡拉通用自我類型不匹配
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
的錯誤是在實例化線
非法遺傳;自我類型apltauer.david.util.Concrete不符合apltauer.david.util.ElementValidator的自定義apltauer.david.util.ElementValidator和apltauer.david.util.Validator [apltauer.david.util.Leaf] Main.scala /依賴/ src/apltauer/david/util line 56 Scala問題
逆變抑制了錯誤,但並沒有解決問題,因爲自我類型沒用。
這不是一個蛋糕模式,你只是使用自我型註釋。我會推薦在這裏使用組合。 – 2013-03-24 21:02:40
只要將這些圖層展開成多個特徵,它就會成爲蛋糕圖案。也許關於蛋糕模式的信息實際上並不那麼重要。我讚賞不同的設計方案,但我仍然想解決這個謎團。 – 2013-03-24 21:07:38
給定的類不能實現用兩種不同類型參數化的(非變體)接口:Foo不能同時擴展Bar [A]和Bar [B]。 – 2013-03-24 21:29:51