我正在創建一個基本上是帶有額外字段的集合的類。但是,我一直在遇到問題,並想知道實現這一點的最佳方式是什麼。我試圖按照Scala書中給出的模式。例如。在Scala中擴展帶額外字段的集合類
import scala.collection.IndexedSeqLike
import scala.collection.mutable.Builder
import scala.collection.generic.CanBuildFrom
import scala.collection.mutable.ArrayBuffer
class FieldSequence[FT,ST](val field: FT, seq: IndexedSeq[ST] = Vector())
extends IndexedSeq[ST] with IndexedSeqLike[ST,FieldSequence[FT,ST]] {
def apply(index: Int): ST = return seq(index)
def length = seq.length
override def newBuilder: Builder[ST,FieldSequence[FT,ST]]
= FieldSequence.newBuilder[FT,ST](field)
}
object FieldSequence {
def fromSeq[FT,ST](field: FT)(buf: IndexedSeq[ST])
= new FieldSequence(field, buf)
def newBuilder[FT,ST](field: FT): Builder[ST,FieldSequence[FT,ST]]
= new ArrayBuffer mapResult(fromSeq(field))
implicit def canBuildFrom[FT,ST]:
CanBuildFrom[FieldSequence[FT,ST], ST, FieldSequence[FT,ST]] =
new CanBuildFrom[FieldSequence[FT,ST], ST, FieldSequence[FT,ST]] {
def apply(): Builder[ST,FieldSequence[FT,ST]]
= newBuilder[FT,ST](_) // What goes here?
def apply(from: FieldSequence[FT,ST]): Builder[ST,FieldSequence[FT,ST]]
= from.newBuilder
}
}
問題是隱式定義的CanBuildFrom需要一個沒有參數的apply方法。但是在這種情況下,這種方法是毫無意義的,因爲需要一個字段(類型FT)來構造一個FieldSequence。實際上,僅僅從一個ST類型的序列中構建一個FieldSequence是不可能的。我能做些什麼來拋出異常?
我想盡可能多的,但我還是留下了如何實現一些東西,做這個問題。也許FieldSequence的抽象方法的默認值? –
你真的需要繼承嗎?或者是組合性夠好,有一個包裝類負責Seq的特殊初始化?包裝器仍然可以實現像「Traversable」這樣較弱的東西,並委託它。 – Landei
我不確定你是否會將我的解決方案算作繼承或組合。我不知道這些術語如何與Scala相比,而不是更傳統的語言。我認爲你正在形成一種p pattern模式,但是由於我控制了班級,所以我認爲沒有必要。 –