Scala类型问题

时间:2011-05-26 14:42:11

标签: scala

我处在一种我想创建一个不可变的集合和一个可变的情况。他们都分享了一些与不变性无关的部分。

也许我应该深入了解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]
}

这样可行,但感觉我正在重复代码中的各种类型。抽象类型是最好的方式,还是应该以不同的方式设计?非常感谢能够以不同的方式做到这一点。

1 个答案:

答案 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都将具有所需的不可变或可变属性,这将由编译器强制执行。