3

Google Guavaのような転送コレクションを作成するためのベスト プラクティスを探しています。たとえば、Scala の ForwardingList は次のようになります。

   trait ForwardingList[T] 
   {
      def delegate: List
   }

ただし、多くの候補があるため、このリストのどの特性を拡張する必要があり、どのメソッドをオーバーライドする必要があるかは明確ではありません

  • List[T]
  • ListLike[T, ForwardingList[T]]
  • ListLike[T, List[T]]
4

2 に答える 2

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
于 2013-01-10T13:35:00.713 に答える
1

Proxyだけを定義する必要があるものを使用したいval self: <Collection>。ただし、これらのクラスはそのプロキシのコレクションを返すためProxy、つまりon 、などを返すので注意してください。SeqProxySeqfiltermap

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] = ???
}

上記のメソッドのみを入力すると、すべての関数でAND リターンのように使用するのではなく、MySeqLikeClass[T]まったく同じように使用できます。SeqMySeqLikeClass[T]Seq[T]SeqProxy[T]

于 2013-01-10T18:02:50.120 に答える