我正在创建一个基本上是带有额外字段的集合的类。但是,我一直在遇到问题,并想知道实现这一点的最佳方式是什么。我试图按照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模式,但是由于我控制了班级,所以我认为没有必要。 –