我正在寻找创建转发集合的最佳做法,例如Google Guava: 例如,Scala中的ForwardingList看起来像:
trait ForwardingList[T]
{
def delegate: List
}
但是我不清楚这个列表应该扩展哪些特征以及哪些方法必须被覆盖,因为有很多候选者
List[T]
ListLike[T, ForwardingList[T]]
ListLike[T, List[T]]
答案 0 :(得分:2)
您可以采用简单的路线并延伸SeqProxy
:
import collection.SeqProxy
class ForwardingList[T](val self: List[T]) extends SeqProxy[T]
val xs = List(2,3,5,7,11,13)
val fs = new ForwardingList(xs)
println(fs.size) // 6
println(fs(0)) // 2
fs foreach println // 2,...,13
答案 1 :(得分:1)
您想要使用Proxy
,这需要您仅定义val self: <Collection>
。但请注意,因为这些Proxy
类会返回该代理的集合,即SeqProxy
会在Seq
,filter
上返回map
等。
ProxyLike
类允许定义类型参数Repr
,以进一步限制代理的返回类型。可以定义:
class MySeqLikeClass[T] extends Seq[T] with SeqProxyLike[T, MySeqLikeClass[T]] {
protected[this] def newBuilder: mutable.Builder[T, MySeqLikeClass[T]] = ???
def seq: Seq[T] = ???
def self: MySeqLikeClass[T] = ???
}
仅填写上述方法,MySeqLikeClass[T]
的使用方式与Seq
完全相同,并在所有功能上返回MySeqLikeClass[T]
,而不是Seq[T]
为SeqProxy[T]
会。