2011-05-26 168 views
1

我处于想要创建一个不可变的集合和一个可变的状态。它们都共享一些与不变性无关的部分。也许我应该潜入并且看看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

为什么downvote? – huynhjl 2011-05-26 15:35:37

+0

你的问题到底是什么?它是如何避免一遍又一遍地重复类型? – pedrofurla 2011-05-26 15:41:45

+0

@huynhjl,这不是我的,但我不反对。 @ chrsan想要学习的内容并不十分清楚。 – pedrofurla 2011-05-26 15:43:04

回答

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将具有所期望的或不可变的可变属性,这将被编译器执行。

+0

太棒了!这更清洁。非常感谢你。 – chrsan 2011-05-27 11:49:42