Lors de la conception de bibliothèques, je finis souvent par recourir au modèle suivant, que je n'aime pas car il en résulte beaucoup de types.
Éviter la diffusion lors du passage d'objets via le code de la bibliothèque (En Delphi)
Le modèle de base est:
Le code en utilisant les mains bibliothèque d'un objet à la bibliothèque, la bibliothèque de mains, puis l'objet Retour au code d'appel. Le code appelant est forcé de lancer l'objet, car la bibliothèque restitue un type générique. (Exemple de code Stripped-dessous)
La bibliothèque définit les objets suivants et la fonction:
TThing = Class
End;
TThingProcessor = Class
Public
Function CreateThing : TThing; Virtual; Abstract;
Procedure ProcessThing (Thing : TThing); Virtual; Abstract;
End;
Procedure DoEverything (Processor : TThingProcessor);
Le code d'appel utilise alors la bibliothèque en remplaçant les objets et appeler DoEverything, comme suit: -
TMyThing = Class(TThing)
Public
X : Integer;
End;
TMyThingProcessor = Class(TThingProcessor)
Public
XSum : Integer;
Function CreateThing : TThing; Override;
Procedure ProcessThing (Thing : TThing); Override;
End;
Function TMyThingProcessor.CreateThing : TThing;
Begin
Result := TMyThing.Create;
End;
Procedure TMyThingProcessor.ProcessThing (Thing : TThing);
Begin
XSum := XSum + (Thing As TMyThing).X;
//Here is the problem, the caller is forced to cast to do anything
End;
La classe de processeur est également une usine TThing. La bibliothèque garantit qu'elle transmettra TThings uniquement au TThingProcessor correspondant qui les a créés, donc cela fonctionne, mais n'est pas sécurisé. Bien que le code ci-dessus soit un peu stupide en ce sens qu'il ne fait vraiment rien, il montre pourquoi ProcessThing ne peut pas simplement être déplacé vers TThing et être polymorphe - la variable XSum doit être mise à jour.
Comment puis-je restructurer le code afin que la distribution ne soit pas nécessaire? Je dois garder le code de la bibliothèque séparé mais être capable d'accepter n'importe quel type.
Edit: Changé le disque à un casting en raison de la suggestion de coulée de sorte qu'il exception au moins deux pas au lieu de l'accident dans le cas des types dépareillées
Je pense que http://stackoverflow.com/questions/681522/casting-between-parent-and-child-classes-in-delphi "pourrait avoir une incidence sur ce que vous essayez de faire – RobS
Merci pour le lien, c'était une lecture utile.Je ne pense pas que cela s'applique directement, mais penser à une restructuration de la même manière me donne des idées, même si je n'ai pas encore pu les identifier. – David