【发布时间】:2016-03-03 16:13:59
【问题描述】:
我想像这样将成员 someProperty 添加到不可变的 Set,
class MySet[A](val someProperty: T, set: Set[A])
extends Set[A] with SetLike[A, MySet[A]] {
//...
}
这样MySet 的行为就像Set。但是,我还不够聪明,无法实现Builder/CanBuildFrom(例如here),它会在转换后保留someProperty。我唯一的解决方案是手动将 MySet 与 map、foldLeft 等连接起来,使其表现得像 Set
class MySet[A](val someProperty: T, set: Set[A]) {
def map[B](f: (A) => B)(implicit bf: CanBuildFrom[Set[A], B, Set[B]]): MySet[B] =
new MySet[B](someProperty, set.map[B, Set[B]](f)(bf))
//more methods here...
}
但这似乎很乏味。有没有更好的方法可以在不进入可变领域的情况下做到这一点?谢谢。
【问题讨论】:
-
如果我理解正确,你觉得扩展乏味,但你发现扩展不乏味? :)
-
@slouc 我发现不扩展乏味,扩展困难/不可能。不过最好延长。
-
我同意扩展很困难,您通过该 SO 链接自己提供了一些证据。如果您想避免手动设置地图和 foldLefts,您可以进行从 Set 到您的类的隐式转换,从而为您的集合添加额外的功能层。基本上你正在接受composition over inheritance。这也是您提供的链接中建议的内容。
-
我不想添加额外的功能层。我想添加一个成员值,隐式类对此无济于事。
-
@Lasf 为什么你的 MySet 类是可变的?它不应该是唯一的案例类,或者 Set 也应该是一个 val。您可以使用大小为 2 的元组,并使用 _._2 操作进行复制
标签: scala scala-2.11