基于toString关闭混合的特征

只是致力于概念证明库 . 试图在可能的地方抽象并混合特征而不是继承,同样使用这个库,实际上只有Character的所有实例之间只有一个共同特征,根本没有类对象混合构建案例对象的特征 . 试图创建一个智能的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方法中生成一个字符串 .

回答(1)

3 years ago

使用 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 = $anon$1@4df5014e D with C with A

scala> new D with C with B
res1: D with C with B = $anon$1@29042f37 D with C with B

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

scala> new E
res3: E = E E@40145d8e with C with A