2017-02-18 14 views
0

我想要求一個case class來實現某些特性中的至少一個。要求某種特質 - >自我類型註釋?

我想,我可以使用自助式註釋是這樣的:

case class DisqualifiedDate(override val paths: Set[DatePath], 
    override val cal: Calendar) extends CalendricDate(paths,cal){ 

    this: DateError => 

    val stringPrefix = "DisqualifiedDate" 
} 

sealed trait DateError 
trait Circular extends DateError 
trait Contradictory extends DateError 
trait Inaccessible extends DateError 

與一個mixin不會編譯不過實例。所以,當我這樣做:

val date = new DisqualifiedDate(Set(datePath),cal) with Circular 

這不會編譯。

我做錯了什麼或者這種做法有缺陷嗎?

已解決:它與普通類,即非案例類完美合作。我不確定這是爲什麼,但我確定。

+0

自我型是指一個具體的類必須實現它。你打算在以後延長DisqualifiedDate嗎?意圖/延伸的雙關是無意的。 –

+0

我想確保DisqualifiedDate也至少有一種類型的DateError。所以輸入不起作用,關於它的一定是錯誤的。 DateError應該標記這裏發生了什麼。 DisqualifiedDate應該可能有多種類型的錯誤。我不想延長DisqualifiedDate本身。 –

+0

也許你做錯了什麼,而且方法有缺陷。 「承載」DateError類型意味着信息以類型或術語編碼(即說明哪個DateError成員)。自我類型意味着您的通知有取消資格日期等。 –

回答

1

獨立案例分類(即沒有0​​或mixins)不能自行輸入。

想想吧。 A case class既是類定義又是單例實例。自我類型引用意味着如果沒有指定的自我類型混合,實例化就不會發生。

您必須將其設爲不帶自動單例創建的類定義,或者在案例中混合所需特徵類被定義。

class DisqualifiedDate(override val paths: Set[DatePath], 
         override val cal: Calendar 
        ) extends CalendricDate(paths,cal) { 
    this: DateError => 
    . . . 

或者......

case class DisqualifiedDate(override val paths: Set[DatePath], 
          override val cal: Calendar 
          ) extends CalendricDate(paths,cal) with DateError { 
    this: DateError => // now redundant 
    . . . 
+0

您的解決方案看起來正確,並且以第一種方式進行操作就是我想要的。我知道我必須每次都進行混音。這正是我想要的。但它不適用於案例類。 –