我想從超類(Tree[A]
)調用子類的構造函數來創建類型爲A
(Part
或Project
)的子類的其他實例。似乎肯定有一種方法比創建中間方法newChild
的混亂更好,因爲像List
這樣的工作。我聽說CanBuildFrom可能會解決這個問題。從工作中如何爲超類中的成員使用Scala子類構造函數?
提取物:
abstract class Tree[A](parent: Option[A], key: Int) {
protected def newChild(aKey: Int): A
lazy val children: List[A] = childrenOf.map(newChild(_))
...
}
case class Part(parent: Option[Part], key: Int) extends Tree[Part](parent, key) {
protected def newChild(aKey: Int) = Part(Some(this), aKey)
...
}
case class Project(parent: Option[Project], key: Int) extends Tree[Project](parent, key) {
protected def newChild(aKey: Int) = Project(Some(this), aKey)
...
}
...
"*" #> <ul>{Part(None, pKey).expandAsHtml}</ul>
什麼是超類中使用Scala的子類構造函數的成員更好的辦法?
你不應該顛倒那個邏輯並從子類構造函數調用超類的構造函數嗎?這是知道按照什麼順序做的事情的子類,而不是超類。 – geekosaur
我很困惑。這段代碼是否編譯?如果編譯,哪些代碼不能編譯?什麼是錯誤消息(完整的錯誤消息,包括代碼行和列指示符)? –
@DCS添加了「從工作代碼中提取」的提示。 –