2016-11-10 57 views
3

我打算擁有一個可以通過多個類擴展的「value」屬性特徵。然後我需要能夠比較彼此之間的特質的不同實例。首先,我想檢查特徵上定義的值 - 如果兩個實例的值相同,那麼我想觸發特定於孩子的方法,它將比較兩個相同類型的子實例。忽略trait的通用方法而不鑄造

我希望我解釋不夠清楚......

我在下面的代碼編寫的,但是ChildOne類犯規編譯 - 錯誤我得到:

類ChildOne需要是抽象的,因爲方法childCheck在性狀 ParentType的類型的(其他:ChildOne.this.T)沒有定義布爾 (注意ParentType.this.T不匹配com.cards.ChildOne)

trait ParentType { 
    val value: Int 
    type T <: ParentType 

    def parentCheck(other: T): Boolean = { 
    if (this.value == other.value) childCheck(other) 
    else this.value > other.value 
    } 

    def childCheck(other: T): Boolean 
} 

case class ChildOne(name: String) extends ParentType { 
    val value = 1 

    override def childCheck(other: ChildOne): Boolean = { 
    true //some custom logic for each child... 
    } 

} 

我可以將孩子的方法的參數更改爲父類型,然後施放它,但我想避免這種情況,我想知道是否有更好的方法來實現我想實現的目標?

任何幫助表示讚賞。

回答

4

您在ParentType中聲明瞭抽象類型 T,但不覆蓋它在ChildOne中。你可以通過在ChileOne中覆蓋T來容易地解決這個問題:

case class ChildOne(name: String) extends ParentType { 
    val value = 1 
    override type T = ChildOne // <---- 

    override def childCheck(other: ChildOne): Boolean = { 
    true //some custom logic for each child... 
    } 
}