【问题标题】:Base toString off what traits are mixed In基于 toString 关闭哪些特征混合在
【发布时间】:2015-04-04 19:37:23
【问题描述】:

只是在开发概念证明库。尝试在可能的情况下抽象并混合特征而不是继承,同样对于这个库,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 方法中创建一个字符串。

【问题讨论】:

    标签: scala


    【解决方案1】:

    使用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
    

    【讨论】:

    • 我从来不知道 super 调用了所有的 toString 方法。我认为除非指定,否则它只调用 1。谢谢您的帮助。我最终对此稍作修改,但效果很好!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-05-09
    • 2013-05-18
    • 2019-11-24
    • 2022-06-16
    • 2010-11-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多