以下の例は、インタフェースを変更するための特性の使用に関連するMartin Oderskyの著書「Programming in Scala」で説明できますか?scalaのインタフェースを変更するための特性
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:
その後、著者は以下の溶液を得た上で行きますか?
この例では何も理解できませんでした。説明してください。
traitが 'super'関数を呼び出すときにどの実装が呼び出されるか注意してください。 – Suma
この本はどのような説明をしていますか? –
@Suma Traitはjavaのhashcodeの実装を呼び出しますか? – user1534615