Y a-t-il un moyen de taper du canard avec Delphi 2007 (c'est-à-dire sans génériques et fonctionnalités de RTTI avancées)? P>
Ressources de dactylographie du canard pour Delphi 2010 Entrée: strong> p>
dernier édition: strong> p>
J'ai davantage plongé dans les résines énumérées ci-dessus et j'ai étudié toutes les réponses publiées ici. P>
Je finis par raffiner mes besoins un Suivi de la poste à cette question. p>
3 Réponses :
Réponse rapide:
réponse plus longue: selon le La page Wiki " Débit de canard "est identifiée par: P>
Dans la typage du canard, on s'intéresse à ces aspects d'un objet utilisé, plutôt qu'avec le type de l'objet lui-même. Par exemple, dans une langue non-dukentre-dactylographiée, on peut créer une fonction qui prend un objet de type canard et appelle les méthodes de marche et de charnière de l'objet. Dans une langue typée du canard, la fonction équivalente prendrait un objet de type et appelerait les méthodes de marche et de charlatan de cet objet. Si l'objet ne dispose pas des méthodes appelées, la fonction signale une erreur d'exécution. P> blockQuote>
Le code non compilable de Delphi équivalent ressemblerait à ceci: p>
xxx pré> i Spécifiez intentionnellement un type pour
d code> parce que cela vaincuerait le but. Delphi est statiquement typée de sorte que cela ne fonctionnerait jamais. Si vous en avez besoin pour une petite fonctionnalité, vous pouvez utiliser
interfaces code> ou
rtti code> et obtenir quelque chose comme ceci: p>
xxx pré> si Vous pouvez obtenir RTTI: p>
xxx pré> J'ai utilisé personnellement la méthode
RTTI code> pour identifier (et manipuler) les objets de liste d'une manière qui rend le code de code avec les deux
TLIST code> descendants et générique
TLIST
code> Variantes. P> Le tirage à distance de cela devrait être: même avec des fonctionnalités avancées dans les dernières versions De Delphi (Generics and Complet RTTI), vous ne ferez que vous rapprocher de la typing de canard pour une fonctionnalité limitée et un effort important. Ceci n'est tout simplement pas dans l'ADN de Delphi (parce que l'ADN de Delphi dit "typing statique"), mais vous pourrait em> être capable d'obtenir quelque chose d'assez proche et avec beaucoup d'effort, et uniquement pour des fonctionnalités spécifiques. . Peut-être que si vous nous donnez une idée de quelles fonctionnalités spécifiques que vous souhaitez, nous serions capables de comprendre quelque chose. P> p>
Merci d'avoir répondu. J'ai plongé dans les codes source des 3 ressources que j'ai citées et que je parvenais à cette conclusion: ils atteignent la typage du canard à l'aide de l'interface, des génériques et de la RTTI à part entière (cible de canard Delphi Targets Delphi Xe2, le reste peut faire avec Delphi Xe).
Je veux pouvoir manipuler tout objet de liste arbitraire implémentant 1) Compte de fonction: Integer; Code> 2)
Fonction GetItem (const Index: Integer): Tobject; Code> 3)
Procédure Ajouter (const Aobject: tobjecte); code> 4)
Procédure Effacer; Code> dans une mode de typage de canard à Delphi 2007.
@MENJARAZ: Ensuite, créez une interface qui possède ces 4 méthodes et utilisez prend en charge () code> pour vérifier si un objet de liste implémente cette interface.
@ Gghie: Cela empêche la manipulation (en mode de frappe de canard comme) d'autres objets ayant implémenté les méthodes que j'ai énumérées mais sans interface. Ai-je raison?
@MENJARAZ: vrai, mais cela poserait-il un problème?
@MenJaraz: Pour l'énoncer une autre façon: pourquoi préféreriez-vous taper du canard (dangereux) sur la coulée à une interface (ou vérifier si l'objet implémente l'interface avant de la jeter), en gardant ainsi la sécurité de type fournie à l'aide de Delphi? Ceci pour moi est le moyen idéal de se préoccuper "avec juste ces aspects d'un objet utilisé, plutôt que avec le type de l'objet lui-même". Avez-vous jamais eu des méthodes surchargées?
@MGHIE: S'il vous plaît voir Daniele Teti's Publication du blog . Je ne veux pas introduire de tabander sur un type code> code> pour n'importe quel type de liste que je dois utiliser dans mes objets métier. Cela peut être atteint avec dortoir.
Voici une idée qui nécessite que vous créez une bibliothèque de type.
Utilisez des types d'automatisation OLE et implémenter des interfaces d'expédition (Objets Dual Com). P>
Vous pouvez maintenant écrire ce que vous voulez. Tapez, et nous découvrirons au moment de l'exécution, que cela fonctionne ou non. Bienvenue sur la dactylographie dynamique. P> Je le considère comme moche, mais d'autres pourraient non. P> p>
+1. Cela ressemble à un très long chemin. J'ai essayé d'implémenter cela comme un test dans une application de console et a échoué (abandonné lorsque j'ai réalisé que j'ai besoin d'une bibliothèque de type enregistrée) - mais ma connaissance COM et OLE est assez proche de zéro. Et sur une note différente, votre fonction n'a pas de type de retour :)
Delphi facilite une rédaction de types doubles, et à l'intérieur de l'application, vous avez besoin d'une bibliothèque de type, mais vous pouvez l'enregistrer localement, sans avoir à l'enregistrer à l'extérieur de Delphi, à l'aide de la touche SLODBYSIDE (SXS) COM. Par laid, oui, je veux dire "long chemin autour", mais cela fonctionne. Cependant, si quelqu'un voulait faire cela dans une application, j'ai eu quelque chose à voir avec, je le rejette hors de la main. Mais comme cela rencontre les besoins de l'OP, au moins strictement parlant, c'est une option.
+1, mais je voudrais supprimer la première phrase. Il n'y a rien de laids à ce sujet (une fois que l'on a décidé de Utiliser i> Duck Typing, qui est un concept étranger à Delphi). Je préférerais que cela soit la réponse acceptée ...
Avec l'aide des types Objauto.PAS et des variants invoquables, il devrait être possible (écrit dans XE mais devrait également exécuter dans Delphi 7 ou plus bas):
type {$METHODINFO ON} TDuck = class public // works in XE, not sure if it needs to be published in older versions procedure Quack; end; procedure TDuck.Quack; begin ShowMessage('Quack'); end; procedure DoSomething(D: Variant); begin D.Quack; end; var d: TDuck; begin d := TDuck.Create; try DoSomething(Duck(d)); finally d.Free; end; end;
+1: C'est ce que j'attends. Je le teste avec Delphi 7 et Delphi 2007: ça marche. Cet article est une réponse acceptable. Danke Sehr!
+1 Allen Bauer a parlé de ce genre de chose avant, par ex. blogs.embarcadero.com/abauer/2007/06/13/36013 Mais je me souviens d'être plus. Ou peut-être que c'était sur le vieux blog de CodeGear de Nick.
+1, j'aime ça. @menjaraz, vous devriez envisager de changer la réponse acceptée.
@Cosmin Prund: C'est bon avec votre accord.
@Stefan Glienke: L'avez-vous utilisé dans la production?
@Menjaraz: Non, je viens de l'écrire hier quand j'ai vu cette question;)
@Stefan Glienke: S'il vous plaît, pouvez-vous envisager cette Poste de suivi . Merci d'avance.