(Teil 3 von „Objektorientierte Gedanken durchsetzen – Über die Delphi-Entwicklung sprechen“)
In den ersten beiden Artikeln ging es um das Thema Kapselung. Hier möchte ich mit Ihnen über Vererbung und Polymorphismus sprechen.
Vererbung und Polymorphismus hängen eng zusammen. Object Pascal führt einen polymorphen Mechanismus namens Überladung ein. Seine Idee hat wenig mit Objektorientierung zu tun und wird hier nicht besprochen. Unser Fokus liegt auf dem Polymorphismus, der eng mit dem objektorientierten Denken verbunden ist.
Polymorphismus basiert auf den Konzepten abstrakter Methoden und virtueller Methoden und ist auch eng mit der Vererbung verbunden. Es wird angenommen, dass wir oft einige zugrunde liegende Objekte definieren und dann einige ihrer Implementierungen als abstrakt definieren, was bedeutet, dass wir nur die Schnittstelle definieren, ohne spezifische Implementierungsdetails zu definieren. Dieser Idee folgend werden wir auch mehrere abgeleitete (geerbte) Objekte definieren, in denen Details, die in der Vorfahrenklasse nicht implementiert wurden, tatsächlich implementiert sind. Dies macht die zugrunde liegende Klasse, die wir zuvor definiert haben, polymorph. Der Vorteil dieses Mechanismus besteht darin, dass wir bei Verwendung dieser Klassen nur einen Codesatz benötigen, um mehrere Funktionen auszuführen. Das Einzige, was geändert werden muss, ist der Teil, der eine Instanz des Objekts erstellt.
Beobachten Sie eine Klasse wie diese:
TStream = Klasse(TObject)
…
öffentlich
function Read(var Buffer; Count: Longint): Longint virtual;
function Write(const Buffer; Count: Longint): Longint virtual;
…
Ende;
Die reservierten Wörter „virtuell“ und „abstrakt“ weisen darauf hin, dass es sich bei den Lese- und Schreibmethoden um rein virtuelle Funktionen handelt. Dies zeigt, dass die TStream-Klasse nicht wirklich verwendet werden kann (Instanzen dieser Klasse können nicht erstellt werden). Es handelt sich lediglich um eine Klasse ähnlich einer Schnittstelle, die die Grundfunktionen definiert, die die TStream-Klasse haben sollte und verarbeiten muss. Außerdem ist festgelegt, dass andere von der TStream-Klasse abgeleitete Klassen Funktionen implementieren müssen (z. B. Lesen und Schreiben usw.).
Beispielsweise implementiert TFileStream die TStream-Klasse in Form von Festplattendateianwendungen, während TMemoryStream die TStream-Klasse in Form von Speicheranwendungen implementiert. Angenommen, es gibt eine Klasse TMyClass, die eine SaveToStream-Methode bereitstellt:
TMyClass = Klasse(TObject)
PROcedure SaveToStream(Stream: TStream);
Ende;
Wenn Sie dann die Idee des Polymorphismus anwenden, können Sie einen Code wie diesen erhalten:
var
strm: TStream;
MyClass: TMyClass;
beginnen
strm := TFileStream.Create('abc.txt'); // ß Der echte Instanztyp von Stream ist hier TFileStream
MyClass := TMyClass.Create;
MyClass.SaveToStream(strm);
…..
Ende;
Um den Inhalt von MyClass im Speicher zu speichern, ändern Sie ihn einfach
strm := TFileStream.Create('abc.txt');
für:
strm := TMemoryStream.Create;
Das ist es.
Die Verwendung von Polymorphismus erfordert natürlich zwei Aspekte der Arbeit: Der Polymorphismus muss in der Klassenstruktur berücksichtigt werden und kann Zwischenklassen (abstrakte Klassen) bereitstellen, die bestimmte Funktionen implementieren Klassen Diese Arbeit spiegelt sich in der Definition einiger Prozeduren und Parameter von Funktionen wider.
Ein weiterer sehr wichtiger Punkt: Ich möchte alle daran erinnern, dass die Klassenplanung im Zeitalter der objektorientierten Programmierung sehr wichtig ist. Das Klassengerüst bestimmt weitgehend das Programmgerüst und bestimmt den Erfolg oder Misserfolg der Softwareentwicklung. Eine klare und hierarchische Klassenarchitektur erleichtert nicht nur die funktionale Aufteilung und Erweiterung, sondern erleichtert auch die Codepflege. Unter diesen ist die Anwendung der Ideen der Vererbung und des Polymorphismus, die Einführung abstrakter Klassen und die Einführung von Zwischenklassen die bevorzugtere Methode.
Im Folgenden sind einige der in Delphi bereitgestellten abstrakten und konkreten Klassen aufgeführt:
konkrete Klasse, abgeleitet von abstrakter Klasse
TStream TFileStream, TMemoryStream;
TCustomIniFile TIniFile, TMemIniFile, TRegistryIniFile;
TStrings TStringList, TMemoStrings, TListBoxStrings;
Es gibt noch viele weitere, die darauf warten, von Ihnen und mir entdeckt zu werden. Das hier am häufigsten verwendete ist TStream, und was mich am meisten überrascht, ist TCustomIniFile. Mit TRegistryIniFile können Sie auf die gleiche Weise wie IniFile auf die Registrierung zugreifen. Dadurch kann ich eine Reihe von Codes verwenden, um die Funktionen zum Schreiben der Registrierung und zum Schreiben von Ini-Dateien zu implementieren. Obwohl die Technologie einfach ist, ist ihre Bedeutung außergewöhnlich!
(Unvollendet, Fortsetzung folgt)
Weitere Artikel