2009-05-12 6 views
8

Ich habe ein Buch über Scala gelesen und es gibt Erwähnung von stapelbare Modifikationen mit Traits. Was sind stapelbare Modifikationen und für welche Zwecke sollen sie verwendet werden?Was sind stapelbare Modifikationen?

+0

Das Buch erklärt es im Merkmalskapitel. – Rayne

Antwort

8

Die grundlegende Qualität, die stapelbare Modifikationen unterscheidet (wie die Terminologie ohnehin in scala verwendet wird) ist, dass "Super" dynamisch beeinflusst wird, je nachdem, wie das Merkmal gemischt ist, während Super im Allgemeinen ein statisch bestimmtes Ziel ist.

Wenn Sie

abstract class Bar { def bar(x: Int): Int } 
class Foo extends Bar { def bar(x: Int) = x } 

dann für Foo "super" Bar wird immer schreiben.

Wenn Sie

trait Foo1 extends Foo { abstract override def bar(x: Int) = x + super.bar(x) } 

Dann schreiben für das Verfahren Super unbekannt bleibt, bis die Klasse gemacht wird.

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 

Warum ist das interessant? Ein anschauliches Beispiel könnten Daten sein, die Sie komprimieren, verschlüsseln und digital signieren möchten. Vielleicht möchten Sie komprimieren, dann verschlüsseln und dann signieren, oder Sie möchten es verschlüsseln, dann unterschreiben, dann komprimieren usw. Wenn Sie Ihre Komponenten auf diese Weise entwerfen, können Sie ein benutzerdefiniertes Objekt mit genau den Bits instanziieren, die Sie nach Ihren Wünschen organisieren möchten.

+0

Nur aus Gründen der Eleganz "Merkmal Foo1 erweitert Bar" statt "Merkmal Foo1 erweitert Foo"? –

+0

Boris - Sie haben absolut Recht, es ist nur so geschrieben, wie es ist, weil ich Bar in letzter Minute hinzugefügt habe. – extempore

1

Ich sah Real-World Scala presentation, wo der Begriff stapelbare Modifikationen auch verwendet wird. Anscheinend sind es Merkmale, die beim Überschreiben die Super-Methode aufrufen, die Funktionalität im Wesentlichen hinzufügen und sie nicht ersetzen. So akkumulieren Sie Funktionalität mit Merkmalen, und es kann verwendet werden, wo in Java oft Aspekte verwendet werden. Trait spielt die Rolle eines Aspekts, indem es die "interessanten" Methoden außer Kraft setzt und die spezifischen Funktionen wie Protokollierung usw. hinzufügt und dann super und "den Ball passierend" zum nächsten Merkmal in der Kette aufruft. HTH.

+0

Was für ein wundervoller Satz Dias! – egaga