私は Scala に関する本を読んでいて、traitsを使用したスタック可能な変更について言及しています。スタック可能な変更とは何ですか? また、それらはどのような目的で使用されますか?
2 に答える
スタック可能な変更を区別する基本的な品質 (この用語はとにかく scala で使用されているため) は、「スーパー」はトレイトがどのように混合されるかに基づいて動的に影響を受けるのに対し、一般にスーパーは静的に決定されるターゲットです。
あなたが書くなら
abstract class Bar { def bar(x: Int): Int }
class Foo extends Bar { def bar(x: Int) = x }
Foo の場合、"super" は常に Bar になります。
あなたが書くなら
trait Foo1 extends Foo { abstract override def bar(x: Int) = x + super.bar(x) }
その場合、そのメソッドについては、クラスが作成されるまで super は不明のままです。
trait Foo2 extends Foo { abstract override def bar(x: Int) = x * super.bar(x) }
scala> (new Foo with Foo2 with Foo1).bar(5)
res0: Int = 30
scala> (new Foo with Foo1 with Foo2).bar(5)
res1: Int = 50
なぜこれが興味深いのですか?分かりやすい例として、圧縮、暗号化、およびデジタル署名するデータが挙げられます。圧縮してから暗号化してから署名したり、暗号化してから署名してから圧縮したりする場合があります。このようにコンポーネントを設計すると、カスタマイズしたオブジェクトを、必要な方法で整理したいビットだけでインスタンス化できます。
スタック可能な変更という用語も使用されているReal-World Scala プレゼンテーションを見ました。どうやら、オーバーライド時にスーパーメソッドを呼び出し、本質的に機能を追加し、それを置き換えないのは特性です。したがって、特性を使用して機能を蓄積すると、Java でよくアスペクトを使用する場所で使用できます。特性はアスペクトの役割を果たし、「興味深い」メソッドをオーバーライドし、ロギングなどの特定の機能を追加してから、スーパーを呼び出してチェーン内の次の特性に「ボールを渡す」。HTH。