我处在一种我想创建一个不可变的集合和一个可变的情况。他们都分享了一些与不变性无关的部分。
也许我应该深入了解Scala集合是如何实现的,但我并不是想创建一个完整的集合类型。
我现在有这个,但感觉不太对。
trait StyleMapping[T <: Style[T]] {
type Mappings <: scala.collection.Map[Option[String], T]
val mappings: Mappings
def get(classNames: List[String]): Option[T] = {
mappings.get(...) // Do something here.
}
}
这是一个不可变实现的例子:
class ImmutableStyleMapping[T <: Style[T]](
val mappings: Map[Option[String], T)
extends StyleMapping[T] {
type Mappings = Map[Option[String], T]
}
这样可行,但感觉我正在重复代码中的各种类型。抽象类型是最好的方式,还是应该以不同的方式设计?非常感谢能够以不同的方式做到这一点。
答案 0 :(得分:1)
鉴于你在这里展示的内容,我认为你不需要使用抽象类型。您的StyleMapping
特征实施必须使用通用Map
。只有子类会关心地图是不可变的还是可变的。考虑到这一点,它可以简化为:
trait StyleMapping[T <: Style[T]] {
val mappings: collection.Map[Option[String], T]
def get(classNames: List[String]): Option[T] = {
mappings.get(...) // Do something here.
}
}
class ImmutableStyleMapping[T <: Style[T]](
val mappings: Map[Option[String],T]) extends StyleMapping[T]
class MutableStyleMapping[T <: Style[T]](
val mappings: collection.mutable.Map[Option[String],T]) extends StyleMapping[T]
在每种情况下,mappings
都将具有所需的不可变或可变属性,这将由编译器强制执行。