2011-05-26 231 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