2009-09-09 9 views
3

Existe-t-il un moyen d'implémenter le polymorphisme statique dans Delphi 2010?Polymorphisme statique dans Delphi

+0

Si vous voulez dire quelque chose comme les gabarits C++ - comment cela s'intégrerait-il au concept d'unité? Autoriser le code dans la section de l'interface? – mghie

+0

Impossible de savoir comment le concept d'unité interfère uniquement avec certaines fonctionnalités des modèles C++. En fait je voudrais avoir toutes les fonctionnalités possibles du modèle C++ (je réalise que les génériques et les templates sont différents) mais cela serait suffisant pour moi maintenant si le compilateur Delphi vérifiait l'expression avec les paramètres génériques après l'instantané générique. Par exemple, je ne veux pas voir "erreur de compilation" quand T - est un paramètre générique et j'essaye d'appeler T.do_some() avant d'utiliser ce type générique avec un type concret. – valentyn

+0

Bien sûr, vous voulez une erreur de compilation dans le cas où T est sans contrainte. Comment le compilateur devrait-il savoir qu'une méthode do_some existe? C'est ce que les contraintes sont pour ... – jpfollenius

Répondre

6

polymorphisme statique est impossible dans Delphi; les génériques ne sont pas des modèles. Contrairement aux modèles, les génériques sont analysés au moment de la déclaration, pas au moment de l'instanciation. C'est pourquoi un module compilé (* .dcu) ne doit contenir qu'une représentation AST de l'entité générique, alors que la construction d'un AST à partir d'une déclaration de modèle C++ non instanciée est presque impossible.

3

Depuis Delphi 2009, il existe des génériques. Combiné avec des contraintes de classe ou d'interface, vous pouvez les utiliser pour implémenter le polymophisme statique.

Malheureusement, les médicaments génériques en soutien Delphi 2009 est très bogué, vous voudrez peut-être envisager d'utiliser Delphi 2010 (relisant votre question, vous semblez être en utilisant D2010 de toute façon)

+0

Mais les contraintes de classe ou d'interface dans les génériques signifient que vmt sera utilisé (temps système d'exécution) et qu'il s'agit toujours d'un polymorphisme dynamique. N'est-ce pas? – valentyn

+0

Le temps d'exécution devrait être minime (1 recherche de tableau je suppose), alors pourquoi cela fait-il une différence après tout? – jpfollenius

+1

Recherche de tableau et appel de procédure je suppose. La même surcharge d'appel de fonction virtuelle. Donc, c'est la même question que "pourquoi utiliser le polymorphisme statique s'il y a un polymorphisme dynamique". Je pense que ça fait une différence quand ça se répète énormément de fois. Quoi qu'il en soit, pourquoi devrais-je payer au moment de l'exécution quand j'ai la connaissance au moment de la compilation de quelle fonction appeler (ou n'appeler aucun). – valentyn