Прежде всего, наличие значения по умолчанию (нуля) для someProperty
немного упрощает задачу. В вашем случае, я думаю, вы могли бы выбрать Must
или MustNot
, в зависимости от специфики вашей проблемы.
Я предполагаю следующее определение T
и его значение по умолчанию:
sealed trait T
object T {
final val Default: T = Must
}
case object Must extends T
case object MustNot extends T
case object Should extends T
Вы можете иметь следующую реализацию для MySet
, перенося большинство операций на его атрибут set
, а некоторые — на сопутствующий ему объект. Кроме того, обратите внимание, что некоторые методы, такие как filter
, не используют CanBuildFrom
, поэтому для них необходимо переопределить метод newBuilder
.
class MySet[A](val someProperty: T, set: Set[A])
extends Set[A] with SetLike[A, MySet[A]] {
def +(elem: A): MySet[A] = new MySet[A](someProperty, set + elem)
def -(elem: A): MySet[A] = new MySet[A](someProperty, set - elem)
def contains(elem: A): Boolean = set contains elem
def iterator: Iterator[A] = set.iterator
override def companion = MySet
override def empty: MySet[A] = MySet.empty[A]
// Required for `filter`, `take`, `drop`, etc. to preserve `someProperty`.
override def newBuilder: mutable.Builder[A, MySet[A]] =
MySet.newBuilder[A](someProperty)
}
Что касается компаньона object MySet
, можно расширить SetFactory[MySet]
или какой-либо другой базовый класс объектов-компаньонов коллекции. Это дает реализации MySet.empty[A]
и MySet.apply[A](as: A*)
, которые создают MySet
, используя значение по умолчанию someProperty
.
object MySet extends SetFactory[MySet] {
// For the builder you can defer to the standard `mutable.SetBuilder`
class MySetBuilder[A](someProperty: T) extends
mutable.SetBuilder[A, MySet[A]](new MySet(someProperty, Set.empty))
def newBuilder[A] = newBuilder[A](T.Default)
// Additional method for creating a builder with a known value of `someProperty`
def newBuilder[A](someProperty: T) = new MySetBuilder[A](someProperty)
// You may also want to define `apply` and `empty` methods
// that take a known `someProperty`.
// `CanBuildFrom` from `MySet[_]` to `MySet[A]`.
implicit def canBuildFrom[A]: CanBuildFrom[Coll, A, MySet[A]] =
new CanBuildFrom[Coll, A, MySet[A]] {
// This is the method that makes
// e.g. `map`, `flatMap`, `collect` preserve `someProperty`
def apply(from: Coll): mutable.Builder[A, MySet[A]] =
newBuilder[A](from.someProperty)
def apply(): mutable.Builder[A, MySet[A]] = newBuilder[A]
}
}
person
Kolmar
schedule
03.03.2016
Set
. Как мне установить значение атрибута при создании экземпляраSet
? - person Lasf   schedule 03.03.2016Builder
/CanBuildFrom
, я хотел бы знать. Сложный вопрос... посмотрим, будет ли на него ответ. - person Lasf   schedule 03.03.2016T
быть каким-то фиксированным типом или параметром типа также и дляMySet
(т.е.MySet[A, T]
)? - person Kolmar   schedule 03.03.2016Must
,MustNot
илиShould
, представляющий логический префикс для набора... но я чувствую, что это запутает вопрос, поэтому я просто оставил его как некоторый произвольный типT
. - person Lasf   schedule 03.03.2016