Im Code des ursprünglichen Systems des Unternehmens habe ich gesehen, wie viele Codes, die die Klassennamenattribute der diskriminierenden Objekte unterscheiden, separat verarbeitet werden. Und es scheint der Standard zu sein, mit ähnlichen Problemen umzugehen. Aber es kann einige Probleme geben.
Erstens wissen wir, dass Polymorphismus eines der drei Hauptmerkmale von objektorientiertem ist. Der sogenannte Polymorphismus ist, dass wir für verschiedene Betontypen über dieselbe abstrakte Schnittstelle auf sie zugreifen können, ohne uns auf die Implementierungsdetails der Betontypen beziehen zu müssen. Genau wie eine Mitteilung: Alle Mitarbeiter versammeln sich morgen um 9 Uhr auf dem People's Square. Es ist nicht notwendig, jede Person, die an einem anderen Ort zu tun hat, genau zu benachrichtigen, an welchem Zeitpunkt und auf welchen Weg zu gehen ist, da dies in der Verantwortung der spezifischen Person liegt, nicht in der Verantwortung der Person, die den Emittenten benachrichtigt. Beim Schreiben, um festzustellen, dass der Klassenname separat verarbeitet werden muss, besteht die erste Möglichkeit, der übergeordneten Klasse eine Schnittstelle hinzuzufügen und sie durch die Unterklasse zu vervollständigen. Ändern Sie die Größe der Abbildung wie folgt:
für i: = 0 bis grafische Liste.count - 1 tun
Beginnen
Grafik: = Grafikliste [i];
Wenn Graphic.className = 'Rechteck' dann
Beginnen
Rechteck (Grafik). Länge: = Rechteck (Grafik). Länge* 2;
Rechteck (Grafik). Width: = Rechteck (Grafik). Width* 2;
Ende
sonst wenn graph.classname = 'circle' dann dann
Beginnen
Kreis (Grafik).
Ende
Ende;
Sie können die "ändernde" Methode zur übergeordneten Klasse "Grafiken" hinzufügen, der Code ist wie folgt
Grafik = Klasse
...
Prozedur ändert sich (Rate: Ganzzahl);
Ende;
Rechteck = Klasse
...
Prozedur ändert sich (Rate: Integer);
Ende;
Kreis = Klasse
...
Prozedur ändert sich (Rate: Integer);
Ende;
Code zum Implementieren von Größenänderungen in bestimmten Grafikklassen:
Prozedur rechteckig.
Beginnen
lang: = lang* Rate;
Breite: = Breite* Rate;
Ende;
Verfahren kreisförmig.changesize (Rate: Ganzzahl);
Beginnen
Radius: = Radius* Rate;
Ende;
Nach dem Ändern dieser Art kann der obige Code so genannt werden:
für i: = 0 bis grafische Liste.count - 1 tun
Beginnen
Grafik: = Grafikliste [i];
Graphics.Changesize (2);
Ende;
Dies macht den Code deutlicher.
Natürlich kann in vielen Fällen die obige Lösung bei der Beurteilung von Klassennamen nicht verwendet werden. Iterieren Sie beispielsweise über die Cotrols von Form und führen Sie erste Versuche an verschiedenen Kontrollen durch. Es ist für uns unmöglich, Tontrol Initialisierungsmethoden hinzuzufügen. Wir können nur bestimmte Unterklasse -Typen unterscheiden. Zu diesem Zeitpunkt empfehle ich, den IS -Operator zu verwenden, anstatt den Klassennamen direkt zu vergleichen.
Die Verwendung von IS führt die Aussage AObject tform zu verschiedenen Arten von AObject:
aObject ist tobject und das Ergebnis ist falsch;
aObject ist tform und das Ergebnis ist wahr;
aObject ist tform1 und das Ergebnis ist wahr;
AObject ist Tedit und das Ergebnis ist falsch;
AObject ist Null und das Ergebnis ist falsch;
Aus dem obigen Beispiel können wir einen Vorteil der Verwendung von IS erkennen. In Zukunft kann TCOOLEDIT verwendet werden, um die Schnittstelle zu verschönern, so
Zweitens, wenn das beurteilte Objekt leer ist, verwenden Sie den Klassennamen, um zu bestimmen, ob das Objekt zuerst zugewiesen ist, andernfalls tritt ein Speicherzugriffsfehler auf. Der Urteilsvertreter muss geschrieben werden als: Wenn sie zugewiesen sind (aObject) und aObject.className = 'TCLASS1';
Der letzte Grund, warum Klassenname nicht als Urteil verwendet werden, ist, dass der Klassenname nur zur Beschreibung der Eigenschaften einer Klasse verwendet wird. Logische Fehler.
Wenn acontrol.classname = 'teidt' 'ist, wird // dieser Code nur überprüft, wenn Sie feststellen, dass die Bearbeitung ursprünglich nicht getestet wird.
Wenn Acontrol Teidt ist, kann // nicht kompiliert und bestanden werden;
Basierend auf dem oben genannten, wenn es notwendig ist, die spezifische Art eines Objekts zu bestimmen, sollten wir in Betracht ziehen, solche speziellen Verarbeitungsanweisungen durch polymorphe Verarbeitung zu vermeiden. als Klassenname.
In einem ganz besonderen Fall kann nicht das gewünschte Ergebnis erhalten, z. die besser sein wird als keiner.
Acooledit ist Tedit // wahr;
acooledit.classtype = TEDIT // false;
acooledit.classtype = tcooledit // true;