Analyse von Polymorphismen in Delphi
1 Was ist Polymorphismus? 2
1.1 Konzept 2
1.2 Die Bedeutung des Polymorphismus 2
1.3 Wie kann man Polymorphismus in Delphi umsetzen? 2
1.3.1 Vererbung 2
1.3.2 Virtuelle Methoden, dynamische Methoden und abstrakte Methoden, VMT/DMT, statische Bindung und dynamische Bindung 2
1.3.3 Überlastung und Polymorphismus 2
1.4 Diskussion über polymorphe Spezies 2
1.4.1 Zwei-Stufe Polymorphismus 2
1.4.2 unsicherer Polymorphismus 2
2 Anwendungen des Polymorphismus in VCL2
2.1 Konstruktions- und Zerstörungsmethode 2
2.2 TStrings2
2.3 Andere (Bitte fügen Sie Seele hinzu) 2
Der abstrakte Polymorphismus ist die Seele des objektorientierten Verständnisses.
Schlüsselwort- Polymorphismus, Vererbung, objektorientierter, VCL, virtuelle Methode, Überschreibung
Frage
Polymorphismus ist die Seele von objektorientiertem, und das Verständnis des Polymorphismus ist einer der Schlüssel für die meistern objektorientierte Technologie. Aber was genau ist Polymorphismus? Was bedeutet Polymorphismus? Wie kann man Polymorphismus erreichen? Ich kann das Konzept des Polymorphismus verstehen, aber ich weiß nicht, wie ich es benutzt und wann ich es benutzt? Bitte lesen Sie diesen Artikel ausführlich.
Expertenanalyse
Die Welt (Objekt, d. H. Objekt) verändert sich ständig; Nun, in der Computersprache. Die gesamte Softwareindustrie war erdschüttelt. Orientierte Entwicklungstools sind auch aufgetaucht, wie VC, Delphi und BCB. Orientierter Design (OOD), objektorientierte Analyse (OOA) und objektorientierte Datenbank (OODB)), objektorientierte Technologie hat fast das gesamte Denkfeld der Programmierer durchdrungen, und es hat sich ebenfalls grundlegende Änderungen unterzogen! In den Augen einiger OO -Reinigungstheoretiker ist alles ein Objekt! Obwohl ich dieser Ansicht nicht ganz einverstanden bin. Ich denke, diese Methode entspricht den Denkgewohnheiten der Menschen Gehirn von da an wurde ich befreit! Dies ist eine Revolution!
Der Kerninhalt von objektorientiertem Objekt, Einkapsel, Vererbung, Polymorphismus und Nachrichtenmechanismen ist es, die Vielfalt der realen Welt zu beschreiben und ist auch das wichtigste Merkmal in objektorientiertem Merkmal. Meisterpolymorphismus, Sie werden die objektorientierte Technologie nicht wirklich beherrschen.
1 Was ist Polymorphismus?
1.1 Konzept
Es gibt viele verschiedene Meinungen zum Konzept des Polymorphismus, und das Folgende sind einige repräsentative Aussagen:
„Diese Fähigkeit, mehr als einen Typ mit einem Zeiger oder einer Referenz auf eine Basisklasse zu manipulieren, spricht als Polymorphismus“ (C ++ - Primer, Seite 838). Das heißt, die Fähigkeit, Objekte mehrerer Klassen (Basisklasse und seine abgeleiteten Klassen) unter Verwendung von Zeigern/Referenzen auf Basisklassen zu betreiben, wird als Polymorphismus bezeichnet. Es wird aus der Perspektive der Sprachumsetzung berücksichtigt.
"polymorphism provides another dimension of separation of interface from implementation, to decouple what from how" ("Think in Java" 3rd edtion), that is, polymorphism provides another kind of separation interface and implementation (i.e., to "what to do" and "Wie man eine Skala von" getrennt "macht. Es wird aus Designperspektive berücksichtigt.
„Die Fähigkeit, den gleichen Ausdruck zu verwenden, um unterschiedliche Operationen zu bezeichnen, wird als Polymorphismus bezeichnet“ (Objektorientierte Methodenprinzipien & Praxis 3rd Edition, S. 16). Einfach ausgedrückt, Polymorphismus ist "gleicher Ausdruck, unterschiedliche Operationen", oder es kann zu "gleichem Befehl, unterschiedliche Operationen" gesagt werden. Dies ist aus der Perspektive der objektorientierten Semantik.
Die drei Aussagen erklären die Essenz des Polymorphismus aus verschiedenen Perspektiven. Die dritte Aussage ist besonders genau.
Lassen Sie mich zuerst die Bedeutung dieses Satzes erklären:
Gleicher Ausdruck - Funktionsanruf
Verschiedene Operationen - es gibt unterschiedliche Operationen nach verschiedenen Objekten.
In einem Unternehmen gibt es beispielsweise verschiedene Mitarbeiter mit unterschiedlichen Aufgaben (Programmierer, Verkäufer, Dokumentenmanager usw.), die bei "zur Arbeit gehen" (können auch als eine Art Geschäftslogik angesehen werden), wir können unterschiedliche Dinge tun. Zusammenfass ihre jeweilige Arbeit als "Arbeit", und die Beziehung lautet wie folgt:
Personal
/ |
Programmierer Verkäufer Dokumentmanager
Sobald die Arbeitszeiten jeden Tag kommen, ist es gleichbedeutend mit der Ausgabe eines Befehls wie folgt:
"Mitarbeiter. Mit der Arbeit beginnen" (gleicher Ausdruck)
Nachdem jeder Mitarbeiter diesen Befehl (denselben Befehl) empfangen hat, "beginnt er zu funktionieren", aber sie tun ihre jeweilige Arbeit, der Programmierer beginnt "codieren", der Verkäufer beginnt "Kontaktgeschäft" und der Kulturmanager Let's Start " Organisieren von Dokumenten “. Das heißt, "der gleiche Ausdruck (Funktionsaufruf), unterschiedliche Vorgänge (nach verschiedenen Objekten während der Laufzeitzeit ausführen)."
Aus der Sicht der Sprachumsetzung des Polymorphismus wird Polymorphismus durch Aufruf seiner virtuellen Methode durch Basisklassenzeiger oder Verweise auf Objekte erreicht, die auf abgeleitete Klassen hinweisen. Das Folgende ist die Implementierung der Objektpascal -Sprache
TEMPLEILEE = CLASS // Abstract -Mitarbeiter in eine abstrakte Klasse
öffentlich
Verfahren Startbearbeitung; virtuell; Abstract;
{Abstract -Funktionen (d. H. Reine virtuelle Funktionen in C ++) tun nichts, die tatsächliche Bedeutung besteht darin, zuerst eine Schnittstelle zu reservieren. Überlastung implementiert es in seiner abgeleiteten Klasse. }
Ende;
TProgramer = class (templatinee) // Programmierer
öffentlich
Prozedur starten;
Ende;
Tbusinessman = class (templatineee) // Verkäufer
öffentlich
Prozedur starten;
Ende;
TdocManager = class (templatineee) // textmanager
öffentlich
Prozedur starten;
Ende;
Prozedur TProgramer.Startworking;
Beginnen
ShowMessage ('Codierung');
Ende;
{Tbusinessman}
Verfahren tbusinessman.Startworking;
Beginnen
ShowMessage ('Linking Business');
Ende;
{Tdocmanager}
Prozedur tdocManager.Startworking;
Beginnen
ShowMessage ('Managing Dokument');
Ende;
procedure tform1.button1click (Absender: tobject);
Const
enum = 3;
var
Mitarbeiter: Array von Templayee;
I: Ganzzahl;
Beginnen
SetLength (Mitarbeiter, Enum);
Mitarbeiter [0]: = tProgramer.create;
// Beziehen Sie sich auf den Mitarbeiter der Basisklasse [0], um auf das gerade erstellte TProgramer -Objekt zu verweisen
Mitarbeiter [1]: = tbusinessman.create;
// Beziehen Sie sich auf den Mitarbeiter der Basisklasse [1], um auf das gerade erstellte Tbusinessman -Objekt zu verweisen
Mitarbeiter [2]: = tdocManager.create;
// Beziehen Sie sich auf den Mitarbeiter der Basisklasse [2], um auf das gerade erstellte TdocManager -Objekt zu verweisen
für i: = 0 bis Länge (Mitarbeiter) -1 tun
Mitarbeiter [i].
{Aus der Sicht des Polymorphismus der Sprache implementieren wird Polymorphismus durch Aufrufen seiner virtuellen Methode durch Basisklassenzeiger oder Referenzobjekt auf abgeleitete Klassen. Mitarbeiter [] bezieht sich auf ein Array für das Basisklassenobjekt, und seine Mitglieder weisen auf verschiedene abgeleitete Klassenobjekte hin.
Ende;
Probieren Sie es aus
Sie können einige der oben genannten Code (oder Demo -Programme) eingeben, kompilieren und ausführen und auf die Schaltfläche klicken, um den magischen Effekt des Polymorphismus anzuzeigen.
1.2 Die Bedeutung des Polymorphismus
Die Bedeutung von Kapselung und Vererbung ist, dass sie die Wiederverwendung von Code implementieren, während die Bedeutung des Polymorphismus die Wiederverwendung von Schnittstellen implementiert (der gleiche Ausdruck). fähig.
Um beispielsweise besser verwaltet zu werden, werden Programmierer in C ++ - Programmierer und Delphi -Programmierer unterteilt. …
Personal
/ |
Programmierer Verkäufer Dokumentmanager
/ / —— Inhoritanzbeziehung
C ++ - Programmierer Delphi Programmierer
Nachdem der Programmierer die beiden abgeleiteten Klassen von TCPPProgramer und Tdelphiprogramer hinzugefügt hatte, änderte sich die Anrufmethode immer noch nicht und es handelte sich immer noch um "Mitarbeiter. Mit der Arbeit beginnen", was mit Objektpascal beschrieben wurde:
…
SetLength (Mitarbeiter, Enum+2);
Mitarbeiter [Enum]: = TCPPProgramer.create;
// Erstellen Sie ein TCPPProgramer -Objekt und weisen Sie den Mitarbeiter der Basisklassenreferenz [Enum] darauf hin
Mitarbeiter [Enum+1]: = tdelphiprogramer.create;
…
{Sektoren.
für i: = 0 bis Länge (Mitarbeiter) -1 tun
Mitarbeiter [i].
…
1.3 Wie kann man Polymorphismus in Delphi umsetzen?
Die notwendigen Bedingungen für die Erreichung von Polymorphismus sind Vererbung, virtuelle Methoden, dynamische Bindung (oder Verzögerungsbindung).
1.3.1 Vererbung
Die Erbschaft bezieht sich auf die Beziehung "AKO (eine Art von, eine) Beziehung zwischen einer Klasse, wie einem Programmierer" ist ein Mitarbeiter, der auf eine Erbschaftsbeziehung hinweist. In Delphi wird nur eine einzelne Vererbung unterstützt (keine Berücksichtigung der durchschnittlichen Vererbung). Durch abgeleitete Klassenobjekte (oder umgekehrt) ist dies das sogenannte "polymorphe Permutationsprinzip".
Hinweis
In UML:
AKO: Eine Art von Erbschaftsbeziehung
APO: Ein Teil von einer Kombinationsbeziehung repräsentiert
ISA: ISA repräsentiert die Beziehung zwischen einem Objekt und einer Klasse, zu der es gehört.
1.3.2 Virtuelle Methoden, dynamische Methoden und abstrakte Methoden, VMT/DMT, statische Bindung und dynamische Bindung
Für alle Methoden gibt es keine Spur im Objekt. Sein Methodenzeiger (Eintragsadresse) wird in der Klasse gespeichert, während der tatsächliche Code im Codesegment gespeichert ist. Für statische Methoden (nicht virtuelle Methoden) bestimmt der Compiler die Eintragsadresse der Objektmethode direkt auf dem Referenztyp des Objekts zur Kompilierung, die als statische Bindung bezeichnet wird. Der Compiler kann die tatsächliche Klasse, zu der er gehört, nicht bestimmen, daher kann die Eintragsadresse der Methode nur über die VMT -Tabelleneintragsadresse (d. H. Die ersten vier Bytes des Objekts) während der Laufzeit ermittelt werden. Lag-Bündelung).
Virtuelle Methode
Eine virtuelle Methode stellt eine Methode dar, die überschrieben werden kann. Die Klasse speichert nicht nur einen eigenen virtuellen Methodenzeiger und speichert auch den Zeiger für virtuelle Methoden aller Basisklassen.
Deklarationsmethode:
Verfahrensmethode Name;
Dies entspricht dem Delphi -Compiler:
Diese Methode kann in der abgeleiteten Klasse überladen werden, und die virtuelle Methode wird nach Überladung noch erfolgen.
Bestimmen Sie nicht die Eintrittsadresse der Methode während der Zusammenstellungsperiode. Während der Laufzeit wird die Eintragsadresse der Methode durch dynamische Bindung ermittelt.
Geben Sie eine Standardimplementierung in der Basisklasse an.
Dynamische Methode
Dynamische Methoden und virtuelle Methoden sind im Wesentlichen gleich. Dies ist jedoch für Benutzer völlig transparent.
Deklarationsmethode:
Verfahrensname; dynamisch;
Zusammenfassung Methoden
Eine spezielle virtuelle Methode, die in der Basisklasse keine Standardimplementierung bereitstellen muss, wird nur für eine aufrufende Schnittstelle verwendet, die einer reinen virtuellen Funktion in C ++ äquivalent ist. Klassen mit abstrakten Methoden werden als abstrakte Klassen bezeichnet.
Deklarationsmethode:
Verfahrensname; virtuell; Zusammenfassung;
VMT/DMT
In Delphi ist die virtuelle Methode Tabelle (VMT) nicht physisch. Virtuelle Methoden seiner Basisklasse. Die in den ersten vier Bytes des Objekts gespeicherte "VMT -Eintragsadresse" ist tatsächlich die Adresse der Klasse, zu der sie gehört (siehe Demo -Programm). Mit der tatsächlichen Klasse kann die Adresse der virtuellen Methode gefunden werden.
OBJ (Objektname) Die Klasse, zu der das tatsächliche Objekt gehört
VMT -Eingangsadresse
Datenmitglieder
VMT -Eintragsadresse der virtuellen Methode Tabelle Klassen
Datenmitglied -Vorlageninformationen
Statische Methoden usw.
Virtuelle Methode (VMT)
Dynamische Methode (DMT)
Abbildung 3 Die Beziehung zwischen Objektnamen, Objekten und Klassen
DMT ähnelt VMT und ist auch ein logisches Konzept. ist nicht so schnell wie die von virtuellen Methoden.
Zitieren Sie das obige Beispiel, um zu erklären:
Mitarbeiter [i].
Mitarbeiter [i] ist eine Objektreferenz der Basisklasse Templeyee. Daher kann das tatsächliche Objekt während der Kompilierung nicht bekannt sein, sodass die Methodenadresse nicht bestimmt werden kann. Während der Laufzeit kenne ich natürlich das "wahre Gesicht von Lushan" des Objekts. Die Funktion, die aufgerufen wird, dh Polymorphismus, wird verwirklicht.
1.3.3 Überlastung und Polymorphismus
Viele Internetnutzer sind der Ansicht, dass die Überlastung von Funktionen auch eine Art Polymorphismus ist, aber nicht. Für "unterschiedliche Operationen" kann die Überlastung nicht die gleiche Anrufmethode bereitstellen. Die Prämisse der Implementierung von Polymorphismus ist der gleiche Ausdruck! Zum Beispiel haben Mitarbeiter [i]. Überlastung ist nur ein Sprachmechanismus, und es gibt auch Überlastung in C, aber C hat keinen Polymorphismus und C ist keine objektorientierte Programmiersprache. Sofern die Überladungsfunktion nicht auch eine virtuelle Methode ist, kann der Compiler die Eintragsadresse der Funktion basierend auf dem Parametertyp oder der statischen Bindung bestimmen! Zitieren Sie den Vater von C ++: "Sei nicht dumm. Wenn es keine dynamische Bindung ist, ist es kein Polymorphismus."
1.4 Diskussion über polymorphe Spezies
1.4.1 Zwei-Stufe Polymorphismus
Objektebene: Verwenden Sie den Basisklassenzeiger/Verweis, um auf das abgeleitete Klassenobjekt zu verweisen und virtuelle Methoden (oder dynamische Methoden, abstrakte Methoden) aufzurufen, die am häufigsten verwendeten.
Klassenstufe: Verwenden Sie Klassenreferenzen (Verweise auf Klassen anstelle von Objekten), um auf abgeleitete Klassen zu verweisen, virtuelle Klassenmethoden (oder dynamische Klassenmethoden, abstrakt Eine Art "für spezielle" Typmethoden finden Sie in meiner anderen Arbeit "Analyse der Struktur und Zerstörung in Delphi", Abschnitt 2.1).
Hinweis
Die Klassenreferenz ist eine Referenzvariable der Klasse selbst, weder eine Klasse noch eine Objektreferenz. Genau wie der Objektname eine Objektreferenz darstellt, repräsentiert der Klassenname eine Klassenreferenz, da in Delphi auch die Klasse als Objekt verarbeitet wird. Ein Klassenreferenztyp ist der Typ einer Klassenreferenz und die Deklarationsmethode eines Klassenreferenztyps:
Klassenreferenztyp Name = Klasse des Klassennamens
Wir können viele Klassenreferenzerklärungen im VCL -Quellcode sehen, z. B.:
TCLASS = Klasse von Tobject;
TcomponentClass = Klasse von tcomponent;
TcontrolClass = Klasse von tcontrol;
Beachten
In einer Klassenmethode ist das in der Methode implizite Selbst eine Klassenreferenz, keine Objektreferenz.
1.4.2 Unsicherer Polymorphismus
Der Polymorphismus kann auch mit abgeleiteten Klassenzeigern/Referenzen auf Basisklassenobjekte implementiert werden!
procedure tform1.btnbadpolyclick (Absender: tobject);
var
CPPProgramer: TCPPProgramer; // Definieren Sie eine CPP -Programmiererreferenz, eine Referenz auf eine abgeleitete Klasse!
Beginnen
{*****************************Stellungnahme******************* ******************
Polymorphismus mit abgeleiteten Klassenzeigern/Verweise auf Basisklassenobjekte. Es ist ein pathologischer Polymorphismus!
Diese polymorphe Methode ist wie eine sehr kleine Sache (Basisklassenobjekt), die mit einem mächtigen bedeckt ist
Das Erscheinungsbild des Produkts (abgeleitete Klassenreferenzen) bringt somit viele potenzielle Unsicherheitsfaktoren (z. B. Zugangsausnahmen)
Ohne Wert. "Datei" Ein Beispiel zielt darauf ab, die Art des Polymorphismus in Delphi, die Art des Polymorphismus zu veranschaulichen: Verwenden Sie einen legalen (normalerweise Basisklassen) Zeiger/Verweis, um das Objekt gemäß dem tatsächlichen Objekt während der Laufzeit zu betreiben, um einen anderen Betrieb auszuführen Methoden oder zu einer lebendigeren Aussage: Das Objekt selbst entscheidet seine eigene Betriebsmethode. das Objekt. Dies ermöglicht die Trennung von Schnittstellen und Implementierungen und ermöglicht die Wiederverwendung der Schnittstelle.
******************************************************** ***************************************}
CPPProgramer: = TCPPProgramer (TProgramer.Create);
{Um diesen pathologischen Polymorphismus zu erreichen, wird die Objektreferenz auf den TCPPProgram -Typ gegossen.
So entkommt der Scheck des Compilers}
CPPProgramer.Startworking;
{TProgramer.Startworking anstelle von TCPPProgram.startworking
Dies ist der Polymorphismus, der mit abgeleiteten Klassenzeigern/Verweise auf das Basisklassenobjekt implementiert wird. }
CPPProgramer.Free;
CPPProgramer: = TCPPProgramer (tdocManager.create);
CPPProgramer.Startworking;
{Der Anruf ist tdocManager.Startworking,
Dies ist der Polymorphismus, der mit abgeleiteten Klassenzeigern/Verweise auf das Basisklassenobjekt implementiert wird. Diese Methode ist äußerst unsicher.
Und es ist nicht nötig}
CPPProgramer.Free;
Ende;
Probieren Sie es aus
Um diese Art von Wahrnehmungsverständnis des Polymorphismus zu erhalten, wird es empfohlen, dies zu versuchen ? Unter welchen Umständen erfolgt eine Ausnahme auf eine Ausnahme? (Siehe Demo -Programm)
2 Anwendungen des Polymorphismus in VCL
2.1 Konstruktions- und Zerstörungsmethoden
Polymorphismus der Konstruktionsmethode
Da der Konstruktor als "spezielle" Klassenmethode angesehen werden kann, werden alle abgeleiteten Klassen nach dem TComponent als virtuelle Klassenmethoden neu definiert. Um den Polymorphismus des Konstruktors zu realisieren, müssen Sie in Delphi Klassenreferenzen verwenden. In jeder Projektdatei gibt es einen Code, der folgt ähnelt:
application.createForm (tform1, Form1);
Definition seiner Methode:
procedure tapPlication.createForm (InstanceClass: tComponentClass; var referenz);
var // InstanceClass ist eine Klassenreferenz.
Instanz: tcomponent;
Beginnen
Instanz: = tcomponent (InstanceClass.Newinstance);
{Newinstance -Methode: Klassenfunktion NewInstance: Tobject; InstanceClass ist eine Klassenreferenz, die Polymorphismus auf Klassenebene implementiert und so die Wiederverwendung der Schnittstelle zum Erstellen von Komponenten realisiert}
Tcomponent (Referenz): = Instanz;
versuchen
Instance.create (self); // rufe den Konstruktor an, um ihn zu initialisieren
außer
Tcomponent (Referenz): = Nil; // eliminieren Sie den "wilden" Zeiger! Gut
erheben;
Ende;
{Wenn das erstellte Fenster und noch keine Hauptformular vorhanden ist, legen Sie das gerade erstellte Formular als Hauptformular fest}
if (fmainForm = nil) und (Instanz ist tform) dann
Beginnen
Tform (Instanz) .Handleneded;
FmainForm: = tform (Instanz); // Setzen Sie die Hauptformular
{In der Tat ist das Festlegen des Hauptformulars in den Projektoptionen (Projektoptionen) tatsächlich die entsprechende Formularanweisung in der Projektdatei vor allen Anweisungen zur Erstellung von Formularerstellung. }
Ende;
Ende;
2) Für den Polymorphismus der Zerstörungsmethode finden Sie in "Analyse der Struktur und Zerstörung in Delphi", Abschnitt 3.3
2.2 TStrings
Die String -Array -Verarbeitung ist in Delphi -Steuerelementen sehr häufig, normalerweise mit einigen Elementenattributen, die für uns besonders bequem sind (da sie alle dieselbe Schnittstelle verwenden) dank der Gestaltung der String -Array -Architektur in Delphi. Dies ist ein erfolgreiches Design.
Da viele Steuerelemente String -Arrays wie Combobox, TstringGrid usw. verwenden, aber die String -Arrays in jeder Steuerung unterschiedlich sind, werden die String -Arrays abstrahiert, sodass viele verwandte Klassen erscheinen. Die Basisklasse TStrings liefert nur eine Schnittstelle für verschiedene Anrufe, und die spezifische Implementierung kann ausschließlich aus ihren abgeleiteten Klassen implementiert werden.
Schauen wir uns die Definition der gemeinsamen Methoden der Basisklasse -TStrings -Klasse an (siehe Klasseneinheit Zeile 442):
Tstrings = Klasse (tpersistent)
geschützt
...
Funktion Get (Index: Ganzzahl): String;
Prozedur Put (Index: Integer; const s: String);
Funktion GetCount: Integer;
…
öffentlich
Funktion add (const S: String): Ganzzahl;
{Fügen Sie eine Zeichenfolge s am Ende der String -Liste} hinzu}
Verfahren addStrings (Zeichenfolgen: TStrings);
{Fügen Sie Strings zum Ende der String -Liste hinzu}
Prozedureinfügung (Index: Integer; const s: String);
{Abstract -Methode, fügen Sie eine neue Zeichenfolge in der Indexposition ein} ein
Verfahren klar;
{Alle Zeichenfolgen löschen}
Prozedur löschen (Index: Integer);
{Löschen Sie eine Zeichenfolge an einem bestimmten Ort}
Funktionsindex (const s: String): Ganzzahl;
{Holen Sie sich die Position von S in der String -Liste}
Funktion Indexofname (const Name: String): Integer;
{Gibt die Position der ersten Zeichenfolge mit dem Formular name = Wert mit dem angegebenen Namenteil} zurück} zurück
Funktion IndexofObject (AObject: Tobject): Integer;
{Holen Sie sich die Position des Objekts mit dem Objekt mit dem Namen AObject: in der String -Liste}
Prozedurlast aus der Abbildung (const Dateiname: String);
{Füllt die Liste mit den Textzeilen in einer angegebenen Datei}}
Prozedurlast aus dem Stream (Stream: TStream);
{Füllt die Liste mit Textzeilen aus einem Stream}
Prozedur SavetOstream (Stream: TStream);
{Schreibt den Wert der Texteigenschaft in ein Stream -Objekt}
Eigenschaftszeichenfolge [Index: Integer]: String lesen
{Verweist auf die Zeichenfolgen in der Liste nach ihren Positionen}
Eigenschaftswerte [const Name: String]: String lesen GetValue schreiben SetValue;
{Repräsentiert den Wertteil eines Zeichens, der einem angegebenen Namen auf Strings mit dem Formular name = Wert zugeordnet ist.}
…
Ende;
Aus der Definition von TStrings ist ersichtlich, dass die meisten seiner geschützten und öffentlichen Methoden virtuelle Methoden oder abstrakte Methoden sind. (Bitte fügen Sie einige hinzu, tstringlist-> tstringgridstring)
2.3 Andere (bitte fügen Sie Seele hinzu)
Wenn Sie den Polymorphismus noch nicht verstehen, erinnern Sie sich bitte an die Essenz des Polymorphismus:
"Gleicher Ausdruck, unterschiedliche Operationen" (es ist so einfach)
Aus der Perspektive der Implementierung der OOP -Sprache besteht der Polymorphismus darin, den Zeiger/die Referenz der Basisklasse zum Betrieb (abgeleitete Klasse) zu verwenden und unterschiedliche Betriebsmethoden gemäß dem tatsächlichen Objekt während der Laufzeit durchzuführen; Eine lebhafte Aussage: Das Objekt entscheidet seine eigene Betriebsmethode. selbst. Dies ermöglicht die Trennung von Schnittstellen und Implementierungen und ermöglicht die Wiederverwendung der Schnittstelle.
Tatsächlich ist Polymorphismus einfach! Worauf sollten Sie bei der Verwendung von Polymorphismus achten? Hier sind meine zwei Vorschläge:
Analysieren Sie die Geschäftslogik, dann verwandte Dinge in "Objekte" und verkapulieren Sie dann die Geschäftslogik mit Objektmethoden. Deklarieren Sie einige Operationen mit Polymorphismus als virtuelle Methoden in der Basisklasse und deklarieren Sie sie als virtuelle abstrakte Methoden für diejenigen, die in der Basisklasse nicht implementiert werden müssen, und überlasten Sie sie dann in ihren abgeleiteten Klassen. /Zeiger der Basisklasse, wenn sie verwendet werden, die natürlich den Polymorphismus in der realen Welt verwirklichen. Denken Sie nicht daran, Polymorphismus aus dem Polymorphismus zu erreichen.
Da es eine natürliche "Kopplungsbeziehung" zwischen Basisklassen und abgeleiteten Klassen gibt, führt die Modifizierung von Basisklassen zu "Erreichen des gesamten Körpers", was sehr problematisch sein wird! Daher müssen wir versuchen, die funktionale Implementierung der Basisklasse zu schwächen, sie bei Bedarf als "abstrakte Klasse" zu entwerfen und eine stabile Schnittstelle zu gewährleisten.
Verwandte Fragen
Diskutieren Sie den Polymorphismus von Delphi: http://www.delphhibbs.com/delphhibbs/dispq.asp?lid=1753965
Über Polymorphismus: http://www.delphhibbs.com/delphhibbs/dispq.asp?lid=1854895
Was ist Polymorphismus? Was sind die Verwendungen in der täglichen Programmierung? http://www.delphibbs.com/delphibbs/dispq.asp?lid=960465
Was ist der Unterschied zwischen Überlastung und Überschreibung? http://www.delphibs.com/delphibs/dispq.asp?lid=296739
Ausgeben, dass der Zeiger der abgeleiteten Klasse auf das Basisklassenobjekt http://www.delphibs.com/delphibs/Dispq.asp?lid=2104106 zeigt
(Die letzte Frage wurde auf Delphibbs erwähnt, als ich zutiefst Polymorphismus studierte, was eine hitzige Diskussion verursachte. Ich schlage vor, Sie sehen einen Blick darauf an)