Dans le code du système d'origine de l'entreprise, j'ai vu de nombreux codes qui distinguent les attributs de nom de classe des objets discriminants sont traités séparément. Et cela semble être le moyen standard de faire face à des problèmes similaires. Mais il peut y avoir des problèmes.
Tout d'abord, nous savons que le polymorphisme est l'une des trois principales caractéristiques orientées objet. Le soi-disant polymorphisme est que pour différents types de béton, nous pouvons y accéder via la même interface abstraite sans avoir à se rapporter aux détails d'implémentation des types de béton. Tout comme la publication d'un avis: tous les employés se réunissent sur la place des gens à 9 heures demain. Il n'est pas nécessaire de notifier spécifiquement chaque personne vivant dans un endroit différent de l'heure prévue et de la voie à prendre, car c'est la responsabilité de la personne spécifique, et non la responsabilité de la personne qui informe l'émetteur. Par conséquent, lors de l'écriture pour déterminer que ClassName doit être traité séparément, la première façon de penser est d'ajouter une interface à la classe parent et de la compléter via le remplacement de la sous-classe. Changer la taille de la figure comme suit:
pour i: = 0 à la liste graphique.Count - 1 do
Commencer
Graphiques: = liste graphique [i];
si graphic.classname = 'rectangle' alors
Commencer
Rectangle (graphique) .length: = rectangle (graphique) .length * 2;
Rectangle (graphique) .Width: = rectangle (graphique) .Width * 2;
fin
sinon si graph.classname = 'cercle' alors
Commencer
Cercle (graphique).
fin
fin;
Vous pouvez ajouter la méthode "Modigesize" aux graphiques de classe parent ", le code est le suivant
Graphiques = classe
...
Procédure change (taux: entier);
fin;
rectangle = classe
...
procédure change (taux: entier);
fin;
Cercle = classe
...
procédure change (taux: entier);
fin;
Code pour implémenter des changements de taille dans des classes graphiques spécifiques:
procédure rectangle.changesize (taux: entier);
Commencer
long: = long * taux;
Largeur: = Largeur * Taux;
fin;
procédure circulaire.changesize (taux: entier);
Commencer
Rayon: = rayon * taux;
fin;
Après avoir modifié de cette façon, le code ci-dessus peut être appelé comme ceci:
pour i: = 0 à la liste graphique.Count - 1 do
Commencer
Graphiques: = liste graphique [i];
Graphics.changesize (2);
fin;
Cela rend le code plus clair.
Bien sûr, dans de nombreux cas, la solution ci-dessus ne peut pas être utilisée lors du jugement de classe. Par exemple, itérez les cotrols de la forme et effectuez des essais initiaux sur différents contrôles. Il est impossible pour nous d'ajouter des méthodes d'initialisation à TControl, nous ne pouvons utiliser que pour distinguer les types de sous-classe spécifiques. Ensuite, à l'heure actuelle, je recommande d'utiliser l'opérateur IS au lieu de comparer directement ClassName.
L'utilisation de l'EI, l'instruction AObject est TFORM Résultat dans différents types d'AOBject:
AOBject est TOBject, et le résultat est faux;
AObject est tform, et le résultat est vrai;
AObject est TForm1, et le résultat est vrai;
AOBject est un fedit, et le résultat est faux;
AObject est nul, et le résultat est faux;
D'après l'exemple ci-dessus, nous pouvons voir un avantage de l'utilisation. À l'avenir, TCoolEdit peut être utilisé pour embellir l'interface, donc ce code n'a pas besoin d'être modifié, car un TCoolEdit est un fedit;
Deuxièmement, si l'objet jugé peut être vide, utilisez le nom de classe pour déterminer si l'objet est attribué en premier, sinon une erreur d'accès à la mémoire se produira. Le représentant du jugement doit être écrit comme suit: si cela est attribué (AObject) et aObject.classname = 'tclass1'; tandis que l'utilisation est écrite comme si AObject est TClass1.
La dernière raison pour laquelle le nom de classe n'est pas utilisé comme jugement est que le nom de classe est uniquement utilisé pour décrire les propriétés d'une classe. Erreurs logiques.
Si acontrol.classname = 'teidt', alors // ce code ne sera vérifié que si vous remarquez que l'édition n'est pas initialement testée;
Si acontrol est teidt, alors // ne peut pas être compilé et passé;
Sur la base de ce qui précède, lorsqu'il est nécessaire de déterminer le type spécifique d'un objet, tout d'abord, nous devons envisager d'éviter de telles instructions de traitement spéciales par le biais d'un traitement polymorphe. que className.
Dans un cas très spécial, il peut ne pas obtenir le résultat souhaité, comme si le Tedit et le TCoolet doivent être gérés séparément. qui sera mieux que rien.
ACOLEDIT est Tedit // Vrai;
acoolEdit.classtype = tedit // false;
acoolEdit.classtype = tCoolEdit // true;