2013-05-02 3 views
0

Je viens de C#/F #/Haskell alors j'essaie de trouver des solutions aux problèmes de programmation que j'ai l'habitude de résoudre avec les types.Quelles sont les bonnes solutions de contournement pour le manque de sémantique de typage statique de dart?

  1. classe A où T: new() en C#, c'est principalement ainsi je peux faire un nouveau T() quelque part. Cela crée une erreur de type mal formé dans Dart. Existe-t-il une façon raisonnablement idiomatique de résoudre ce problème? Peut-être avec des usines? J'ai fait quelques expériences avec des mixins, dans le cas de conflits de noms pour les membres mixin hérités, le dernier mixin gagne. Donc pour ce qui suit: abstract class mixA {void foo(); } abstract class mélangeB {void foo(); } la classe C étend Object avec mixA, mixB {} new C(). Foo();

cela finirait par appeler mixB.foo(), alors que la classe C extends Object avec mixB, Mixa {} finirait par appeler mixA.foo() Y at-il de toute façon d'accéder aux membres du caché les mixins? Supposons que je mélange 2 mixins avec un champ du même nom.

Est-ce que l'instance de la sous-classe a 2 champs lors de l'exécution (seulement 1 est inaccessible) ou l'objet est-il comme un dictionnaire et il y a seulement 1 emplacement pour chaque nom?

Répondre

4

1 n'est pas possible. Vous ne pouvez pas appeler new sur un type générique (ou variable d'ailleurs). La solution de contournement la plus courante consiste à créer une fermeture qui alloue l'objet à la place.

Les réponses pour 2 tomber du fait que Mixins peut être considéré comme super-classe: A extends Object with B, C est essentiellement équivalent à:

class B' extends Object { <copy over code inside B> } 
class C' extends B' { <copy over code inside C> } 
class D extends C' { ... } 

Avec cela à l'esprit:

  • pas. il n'y a aucun moyen d'accéder à des superéléments cachés.
  • oui. vous finiriez avec plusieurs champs.

Petite note: la partie <copy over code inside X> n'est pas complètement correcte car cela changerait la portée de la bibliothèque. Le code du mixin B est conceptuellement dans la bibliothèque où le mixin est déclaré.

Questions connexes