2009-05-12 7 views

Répondre

8

La qualité fondamentale qui distingue les modifications empilables (comme la terminologie est utilisée dans scala de toute façon) est que "super" est influencé dynamiquement sur la façon dont le trait est mélangé, alors qu'en général super est une cible déterminée statiquement.

Si vous écrivez

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

alors pour Foo "super" sera toujours Bar.

Si vous écrivez

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

Ensuite, pour ce super méthode reste inconnue jusqu'à ce que la classe est faite.

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 

Pourquoi est-ce intéressant? Un exemple illustratif peut être certaines données que vous souhaitez compresser, chiffrer et signer numériquement. Vous pouvez compresser puis chiffrer puis signer, ou vous pouvez chiffrer puis signer puis compresser, etc. Si vous concevez vos composants de cette manière, vous pouvez instancier un objet personnalisé avec exactement les bits que vous voulez organiser comme vous le souhaitez.

+0

Juste pour l'élégance "trait Foo1 extends Bar" au lieu de "trait Foo1 extends Foo"? –

+0

Boris - tu as absolument raison, c'est écrit comme ça parce que j'ai ajouté Bar à la dernière minute. – extempore

1

J'ai regardé Real-World Scala presentation où le terme modifications empilables est également utilisé. Apparemment, ce sont les traits qui appellent la super méthode lors du remplacement, ajoutant essentiellement des fonctionnalités et ne les remplaçant pas. Donc, vous accumulez des fonctionnalités avec des traits, et cela peut être utilisé là où en Java nous utilisons souvent des aspects. Trait joue le rôle d'un aspect, remplaçant les méthodes "intéressantes" et ajoutant les fonctionnalités spécifiques telles que la journalisation, etc., puis appelant super et "passer la balle" au trait suivant de la chaîne. HTH.

+0

Quel merveilleux jeu de diapositives! – egaga

Questions connexes