2010-03-15 7 views
0

Je prévois d'avoir une collection d'éléments stockés dans un TCollection.Héritage de TCollectionItem

Chaque élément dérivera de TBaseItem qui à son tour dérive de TCollectionItem,

Avec cela à l'esprit la collection retournera TBaseItem lorsqu'un élément est demandé.

Maintenant, chaque TBaseItem aura une fonction Calculate, en l'TBaseItem ce sera juste revenir une variable interne, mais dans chacune des dérivations de TBaseItem la fonction Calculate nécessite un ensemble de paramètres différents.

La Collection aura une fonction Calculate All, qui le fait à travers les objets de collection et appelle chaque fonction Calculate, évidemment il faudrait passer les paramètres corrects à chaque fonction

je peux penser à trois façons de le faire:

  1. Créer une méthode abstraite/virtuelle pour chaque fonction de calcul dans la classe de base et le remplacer dans la classe derrived, cela signifierait pas coulée de type a été nécessaire lors de l'utilisation de l'objet, mais il serait aussi dire que je dois créer beaucoup de méthodes virtuelles et ont un grand si .. Instruction .else détectant le type et appelant la bonne méthode "calculate", cela signifie aussi que l'appel de la méthode calculate est sujet à l'erreur comme vous devriez le savoir lors de l'écriture du code à appeler pour quel type avec les paramètres corrects pour éviter une erreur/EAbstractError.

  2. Créer une structure d'enregistrement avec tous les paramètres possibles et l'utiliser comme paramètre pour la fonction « calculer ». Cela a l'avantage supplémentaire de passer à la fonction "calculer tout" car elle peut contenir tous les paramètres requis et éviter une liste de paramètres potentiellement très longue.

  3. Il suffit de taper la coulée du TBaseItem pour accéder à la méthode de calcul correcte. Cela rangerait le TBaseItem plutôt par rapport à la première méthode.

Quelle serait la meilleure façon de gérer cette collection?

+2

Les collections ne sont vraiment pas conçues pour être utilisées de façon polymorphique. L'éditeur de collection par défaut crée toujours des éléments du même type, qui est le type que vous transmettez au constructeur de la collection. Si vous ne prévoyez pas de modifier le contenu de la collection à partir du Concepteur de fiches, ne commencez pas par TCollection. Utilisez une autre classe de conteneur, telle que TObjectList, ou même votre propre sous-classe directe de TObject. –

+0

Je n'ai aucun problème avec l'utilisation de TCollection par polymorphisme. Le problème était beaucoup plus lié au passage de différents paramètres à la même méthode par différents descendants. –

Répondre

1

Si tous ont des signatures de méthode, alors vous n'êtes pas vraiment quoi que ce soit en gagne ayant des méthodes virtuelles - ils pourraient aussi bien être statique. Je serais en faveur d'un ensemble de paramètres "génériques"/"canoniques" comme dans votre cas 2, et de méthodes de calcul virtuelles/substituées, au moins basées sur la description que vous avez donnée jusqu'à présent.