2015-02-05 83 views
0

只是在概念庫的證明工作。試圖在可能的情況下進行抽象並且混合使用特徵而不是繼承,對於這個庫來說,實際上只有Character的所有實例之間有一個共同的特徵,就是沒有任何類對象只是混入來構建一個case對象的特徵。試着做一個聰明的toString實現,它能夠識別我混入的特性並相應地改變toString。我目前的理論是有這樣的事情:基礎toString什麼特性混合在

//Completely wrong, just a rough pseudocode of one potential ideal 
implicit class CharImpl[A <: Character](a: A){ 

    def toString:String = { 
    for(
     i ← _:HasName ⇒ s"Name: ${a.name}" 
     j ← _:HasAbbreviation ⇒ s"Abbreviation: ${a.castTo[HasAbbreviation].abbreviation}" 
     k ← _:HasUnicode ⇒ s"Unicode: ${a.castTo[HasUnicode].unicode}" 
     l ← _:HasDecimal ⇒ s"Decimal: ${a.castTo[HasDecimal].decimal}" 
    ) {(i,j,k,l) mkString "\n"} 
    } 
} 

另一種選擇是讓每個特性需要一個toString實現(可能會雖然使用不同的名稱)。然後列出所有具有此toString函數的特徵。然後從特徵的所有toString方法中創建一個單一字符串。

回答

3

那麼使用super.toString加上一些新的東西來重寫toString怎麼樣?

trait A { override def toString: String = super.toString + " with A" } 

trait B { override def toString: String = super.toString + " with B" } 

trait C { override def toString: String = super.toString + " with C" } 

class D { override def toString: String = super.toString + " D" } 

scala> new D with C with A 
res0: D with C with A = [email protected] D with C with A 

scala> new D with C with B 
res1: D with C with B = [email protected] D with C with B 

class E extends C with A { override def toString: String = "E " + super.toString } 

scala> new E 
res3: E = E [email protected] with C with A 
+0

我從來不知道super調用了所有的toString方法。除非另有說明,否則我認爲它只叫1。謝謝您的幫助。我已經結束了稍微修改,但它工作得很好! –