Klassen in Delphi - Michael Puff/ · PDF file1. Eine Klasse in Delphi des Erzeugens und die...

download Klassen in Delphi - Michael Puff/ · PDF file1. Eine Klasse in Delphi des Erzeugens und die Verwaltung eines Objektes zur Laufzeit. Methoden werden in einer Klassendeklaration als

If you can't read please download the document

Transcript of Klassen in Delphi - Michael Puff/ · PDF file1. Eine Klasse in Delphi des Erzeugens und die...

  • Einfhrung in die objektorientierte Programmierung mit Delphi

    Klassen in Delphi

    Michael [email protected]

    2010-03-26

  • Inhaltsverzeichnis

    Inhaltsverzeichnis

    1. Eine Klasse in Delphi 61.1. Grundlegendes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 61.2. Sichtbarkeiten . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 71.3. Konstruktor, Destruktor . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9

    1.3.1. Konstruktor . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 91.3.2. Destruktor . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10

    1.4. Eigenschaften . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 111.4.1. Auf Eigenschaften zugreifen . . . . . . . . . . . . . . . . . . . . . . . . 11

    2. Vererbung, Polymorphie und abstrakte Klassen 132.1. Erweiterte Methodendeklaration und -implementierung . . . . . . . . . . . . . 14

    2.1.1. inherited . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 142.1.2. Self . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14

    2.2. Methodenbinding . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 142.2.1. Statische Methoden . . . . . . . . . . . . . . . . . . . . . . . . . . . . 152.2.2. Virtuelle und dynamische Methoden . . . . . . . . . . . . . . . . . . . 16

    2.3. Methoden berladen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20

    3. Klassenreferenzen 223.1. Klassenoperatoren . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22

    3.1.1. Der Operator is . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 223.1.2. Der Operator as . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22

    3.2. Klassenmethoden . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23

    A. Demos 24A.1. Einfache Klasse . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24A.2. Einfache Vererbung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25A.3. Statische Methoden . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27A.4. Polymorphie . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28A.5. Reintroduce . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30A.6. Klassenreferenzen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30A.7. Klassenmethoden . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31

    B. Anhang 33B.1. Vorgnge beim Aufruf des Konstruktors . . . . . . . . . . . . . . . . . . . . . 33B.2. Vorgnge beim Aufruf des Destruktors . . . . . . . . . . . . . . . . . . . . . . 34B.3. Funktionsweise von Methodenzeigern . . . . . . . . . . . . . . . . . . . . . . 35B.4. Windows-API Callback-Funktion als Methode einer Klasse . . . . . . . . . . . 36

    2

  • Inhaltsverzeichnis

    Literaturverzeichnis 38

    3

  • Inhaltsverzeichnis

    Vorwort

    Die Objektorientierter Programmierung (OOP) ist im Prinzip nur eine Definition, wie der Pro-grammierer zur Entwurfszeit seine Programmschnittstellen zu definieren hat. Die OOP ba-siert auf der prozeduralen Programmierung und stellt einen berbau da, der es ermglichtstrukturierte Schnittstellen zu entwerfen. Dieser berbau muss die Fhigkeit besitzen, dassdie Schnittstellen zur Laufzeit selbst ber die verwendeten Schnittstellen Auskunft zu ge-ben. In Delphi geschieht dies mit ber die Typinformation (RTTI = Run Time Type Informa-tion). Dadurch wird es mglich eine strenge Typprfung und somit mehr Sicherheit in denSchnittstellen zu implementieren. Die Mittel OOP umzusetzen basieren also teilweise aufprozeduraler Programmierung und auf den Fhigkeiten des Compilers und der IDE.

    Grundgedanke von OOP war es Programmierer dazu zu zwingen, strukturierten, wieder-verwendbaren und erweiterbaren Code zu entwickeln. Da dies nur in einer restriktiven undstrukturierten Programmiersprache wird dadurch auch erklrbar. Die Grundlage der OOP istdas Klassenkonzept. Objekte selber sind nur die zur Laufzeit existierenden Datencontainerderen Schnittstellen durch die Klasse klar definiert wurden.

    Die Objektorientierung fhrt nun ganz neue Programmiertechniken ein: Kapselung, verber-gen von Code, Zugriff nur ber definierte Schnittstellen; Vererbung, Erweiterung von beste-hen den Code; Wiederverwendbarkeit, Code kann einfach in anderen Projekten wiederver-wendet werden. Auf der einen Seite erfordert dies ein gesteigertes Abstraktionsvermgendes Programmierers. Auf der anderen Seite ist eine Klasse auch der Versuch die Wirklich-keit programmiertechnisch abzubilden.

    4

  • Inhaltsverzeichnis

    Danksagung

    An dieser Stelle will ich mich recht herzlich bei allen aus der Delphi-Praxis bedanken, diemir bei der Erarbeitung dieses Tutorials helfend bei Seite gestanden haben. Mein Dank giltins besondere choose fr sein Beispiel zur Polymorphie, Motzi fr weitere Erluterungenund den Beitrgen und Code Beispielen von Chewie, Bernd Ua und NicoDe zu Klassen-methoden. Natrlich darf an dieser Stelle auch nicht meine liebe Freundin Micky vergessenwerden, die sich die Mhe gemacht hat, das ganze Korrektur zu lesen, obwohl sie wahr-scheinlich kein Wort von dem verstanden hat, was sie gelesen hat.

    Insbesondere Danke ich Andreas Hausladen dafr, dass ich seine Texte bezglich der In-terna was beim Aufruf des Konstruktors und Destruktors passiert und wie Delphi Metho-denzeiger realisiert bernehmen durfte (siehe dazu die Kapitel B.1, B.2 und B.3 ab Seite33). Ursprnglich erschienen diese Texte auf der Delphi Seite Delphi-Source Der Delphi-Treff1.

    Michael Puff, Kassel den 26. November 2007.

    1http://www.dsdt.info/

    5

    http://www.dsdt.info/

  • 1. Eine Klasse in Delphi

    1. Eine Klasse in Delphi

    1.1. Grundlegendes

    Eine Klasse (auch Klassentyp) definiert eine Struktur von Feldern, Methoden und Eigen-schaften. Die Instanz eines Klassentyps heit Objekt. Die Felder, Methoden und Eigenschaf-ten nennt man auch ihre Komponenten oder Elemente.

    Felder sind im Wesentlichen Variablen, die zu einem Objekt gehren. Eine Methode ist eine Prozedur oder Funktion, die zu einer Klasse gehrt. Eine Eigenschaft ist eine Schnittstelle zu den Daten (Feldern) eines Objektes. Eigen-

    schaften verfgen ber Zugriffsbezeichner, die bestimmen, wie ihre Daten gelesenoder gendert werden sollen (Getter/Setter).

    Objekte sind dynamisch zugewiesene Speicherblcke, deren Struktur durch die Klasse fest-gelegt wird. Jedes Objekt verfgt ber eine Kopie der in der Klasse definierten Felder. DieMethoden werden jedoch von jeder Instanz gemeinsam genutzt. Das Erstellen und Freige-ben von Objekten erfolgt mit Hilfe spezieller Methoden, dem Konstruktor und dem Destruk-tor.

    Eine Klassentypvariable ist ein Zeiger auf ein Objekt. Deshalb knnen mehrere Variablenauf dasselbe Objekt verweisen. Sie knnen also auch, wie andere Zeigertypen, den Wertnil annehmen. Sie mssen aber nicht explizit dereferenziert werden, um auf das betreffendeObjekt zuzugreifen.

    Ein Klassentyp muss deklariert und benannt werden, bevor er instantiiert werden kann.Die Deklaration einer Klasse steht im Interface-Abschnitt einer Unit. Die Implementation imImplementations-Abschnitt. Eingeleitet wird die Deklaration einer Klasse mit dem Schlssel-wort type, gefolgt von dem Bezeichner der Klasse, einem Gleichheitszeichen, dem Schls-selwort class und in Klammern eventuell die Angabe einer Klasse, von der die neue Klasseabgeleitet werden soll.

    typeTMyClass = class(TParent)Elementliste

    end;

    TMyClass ist ein beliebiger, gltiger Bezeichner. Die Angabe einer Vorfahrenklasse (TParent)ist optional. Gibt man keinen Vorfahren an, so nimmt Delphi automatisch die Klasse TObjectals Vorfahre der Klasse an. Die in der Unit System deklarierte Klasse TObject ist der abso-lute Vorfahre aller anderen Klassentypen. In ihr sind alle Methoden implementiert, die ntigsind zur Erstellung und Verwaltung einer Klasse. Das betrifft unter anderem den Prozess

    6

  • 1. Eine Klasse in Delphi

    des Erzeugens und die Verwaltung eines Objektes zur Laufzeit. Methoden werden in einerKlassendeklaration als Funktions- oder Prozedurkpfe ohne Rumpf angegeben.

    Die Methoden einer Klasse werden im ImplementationsAbschnitt einer Unit implementiert.Dabei wird die Schlsselwrter procedure oder function vorangestellt. Es folgt der Klas-senname und durch den Gltigkeitsoperator . gefolgt die Methode.

    procedure TMyClass.Something;begin

    end;

    Tipps und Tricks:

    Bei Klassennamen gilt als Konvention, dass man den Klassennamen mit einem groemT beginnen lsst, welches fr den Begriff Type steht. Aus Grnden der bersichtlichkeit sollte man auch bei Klassen ohne Vorfahre TObject

    als Vorfahre angeben. Ein Klassentyp ist zu seinen Vorfahren zuweisungskompatibel.

    Siehe dazu Demo einfache Klasse.

    1.2. Sichtbarkeiten

    Sichtbarkeit bedeutet, dass man den Zugriff nach auen hin einschrnkt, das heit, derAnwender einer Klasse sieht nur das, was er sehen muss, um die Klasse einzusetzen. Ersieht also nur die von der Klasse definierten und zur Verfgung gestellten Schnittstellen.Auf interne Methoden der Klasse, die die Klasse zur Manipulation der Daten implementiert,hat der Anwender keinen Zugriff, womit die Klasse die Sicherheit der Eigenschaften wahrenkann. In einer Klasse hat jedes Element ein Sichtbarkeitsattribut, das durch die reserviertenSchlsselwrter private, protected, public angegeben wird. Ein Element ohne Attri-but erhlt automatisch die Sichtbarkeit des vorhergehenden Elementes in der Deklaration.Die Elemente am Anfang einer Klassendeklaration ohne Sichtbarkeitsangabe werden stan-dardmig als published bzw. public deklariert. Grundstzlich unterscheidet man zweiArten