2017-01-09 4 views
0

以下の例は、インタフェースを変更するための特性の使用に関連する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:

その後、著者は以下の溶液を得た上で行きますか?

この例では何も理解できませんでした。説明してください。

+0

traitが 'super'関数を呼び出すときにどの実装が呼び出されるか注意してください。 – Suma

+0

この本はどのような説明をしていますか? –

+0

@Suma Traitはjavaのhashcodeの実装を呼び出しますか? – user1534615

答えて

1

あなたは "Q1"の上の行に答えました: "問題はBookのhashCodeメソッドがHashCaching'sをオーバーライドしていることです。" HashCashingで混在して実装をオーバーライドするので、使用されることはありません。

もう1つの例では、実装はBaseBookによって提供され、次にHashCachingによってオーバーライドされ、それを補強してからBookによって継承されます。この場合、Bookは実装をオーバーライドしないので、意図したとおりに動作します。

関連する問題