问题描述
|
我想创建一个不可变的集合(如collection)和一个可变的对象。它们都共享一些不变性相同的部分。
也许我应该深入研究一下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]
}
这可行,但是感觉就像我在代码中重复了所有类型。抽象类型是最好的方法吗,还是应该以不同的方式进行设计?非常感谢您能以不同的方式对此有所了解。
解决方法
鉴于您在此处显示的内容,我认为您不需要使用抽象类型。您的
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]
在每种情况下,“ 5”都将具有所需的不可变或可变属性,这将由编译器强制执行。