用于修改scala中的接口的特性

时间:2017-01-09 13:07:34

标签: scala hash

有人可以在书中解释下面的例子" Scala编程"由Martin Odersky撰写,涉及使用特征修改界面。

trait HashCaching {
  private var cachedHash: Int = 0
  private var hashComputed: Boolean = false

  /** Override the default Java hash computation */
  override def hashCode = {
    if (!hashComputed) {
      cachedHash = super.hashCode
      hashComputed = true
    }
    cachedHash
  }
}

但是,尝试使用它会遇到问题:

class Book(val author: String, val title: String) extends Ordered[Book] with HashCaching {
  // compare and equals() as before...
  override def hashCode = {
    Thread.sleep(3000) // simulate a VERY slow hash
    author.hashCode + title.hashCode
  }
}

此版本未缓存其哈希码!问题是Book的 hashCode方法重写HashCaching。

Q.1我无法理解为什么哈希码不会被缓存?

然后作者继续给出以下解决方案:

abstract class BaseBook(val author: String, val title: String) {
  override def hashCode = {
    Thread.sleep(3000)
    author.hashCode + title.hashCode
  }
}
class Book(author: String, title: String) extends BaseBook(author, title) with Ordered[Book] with HashCaching {
  // compare and equals() as before...
}

Q.2如何在基类效果中覆盖哈希码,现在哈希码被缓存了?

在这个例子中我什么都听不懂,请解释一下。

1 个答案:

答案 0 :(得分:1)

你回答了它上面的“Q1”:“问题是Book的hashCode方法覆盖了HashCaching。”你混合HashCashing,然后覆盖实现,所以它最终永远不会被使用。

在另一个示例中,实施由BaseBook提供,然后由HashCaching覆盖,增强它,然后由Book继承。在这种情况下,Book不会覆盖实现,因此,它可以按预期工作。