Klassen, Objekte und Instanzen Schach

Object Pascal im Detail - Objektorientierung www.delphi-treff.de 91 Prozeduren und Funktionen steht hier nur der Kopf der Routine Name, Parameter und evtl. Rückgabewert. Die Definition folgt dann im implementation-Abschnitt. Der interface-Abschnitt endet mit Beginn des implementation-Abschnitts.

4.7.6. initialization und finalization

Bei Bedarf können am Ende einer Unit noch zwei Abschnitte stehen: initialization und finalization. Initialization muss dabei als erstes aufgeführt werden. Hier werden alle Befehle aufgeführt, die bei Programmstart der Reihe nach ausgeführt werden sollen. Danach folgt das Ende der Unit end. oder der finalization-Abschnitt. Dieser ist das Gegenstück zu initialization. Hier können z. B. vor Programmende Objekte freigegeben werden. Der Aufbau einer Units sieht dann so aus: unit Unit1; interface implementation initialization finalization end. finalization kann nur verwendet werden, wenn es auch einen initialization-Abschnitt gibt; initialization kann jedoch auch ohne finalization vorkommen. Beide Abschnitte werden eher selten verwendet. Units funktionieren auch ohne sie. Bei Verwendung von Klassen siehe folgendes Kapitel kommen Konstruktor und Destruktor zum Einsatz, um Code zum Initialisieren und Freigeben ausgeführt werden soll.

4.8. Objektorientierung

In diesem Kapitel wollen wir uns anschauen, was objektorientierte Programmierung ist. Ohne es zu wissen, hatten wir bereits in obigem Beispiel damit zu tun, denn jede Komponente, die in der Toolbar zu finden ist, ist ein Objekt. Auch das Fenster selbst.

4.8.1. Klassen, Objekte und Instanzen

Eine Klasse ist der Bauplan eines Objekts, sozusagen ein komplexer Datentyp, der auch eigene Funktionalität enthält. Neh e i als Beispiel u s Me s he . Ei e Klasse „Me s h ü de es h ei e , el he Eigenschaften ein Mensch haben kann Größe, Gewicht, Haarfarbe usw. und welche Aktionen er ausführen kann z.B. schlafen, sprechen, gehen. Object Pascal im Detail - Objektorientierung www.delphi-treff.de 92 Ein Objekt, auch Instanz ge a t, ist ei ko k etes „Di g . In unserem Beispiel bist du, deine Eltern und jeder, der dir sonst so auf der Straße begegnet, eine Instanz der Klasse „Mensch . Alle folgen dem in der Klasse definierten Bauplan. Alle haben sie eine Größe, ein Gewicht und eine Haarfarbe. Jede Instanz kann hier natürlich unterschiedliche Werte haben, schließlich sind nicht alle Menschen gleich groß und schwer. Weiteres Beispiel sind die Eingabefelder in unserer Anwendung: Sie folgen alle dem Bauplan der Klasse „TEdit . D.h. sie haben gleiche Eigenschaften und gleiches Verhalten. Von diesem Bauplan kann es beliebig viele Instanzen geben, die alle unterschiedliche Ausprägungen haben können. Jedes Eingabefeld hat einen anderen Namen, einen anderen Inhalt, eine andere Position innerhalb des Fensters usw. Das alles sind Eigenschaften eines TEdit und noch viel mehr. Wenn man etwas programmieren will, überlegt man sich vorher, welche Dinge aus der Realität in dem Programm abgebildet werden sollen, die jeweils eigene Eigenschaften und eigenes Verhalten haben sollen. Diese implementiert man dann als Klassen. Würde man eine Anwendung für ein Einwohnermeldeamt s h ei e , so ä e „Me s h tatsä hli h ei e Klasse, die a ge rauchen könnte. Das klingt etwas abstrakt, deshalb schauen wir uns das an einem konkreten Beispiel an.

4.8.2. Schach

Du kennst sicher das Spiel Schach. Wir wollen hier kein komplettes Schachspiel programmieren, weil das nicht ganz einfach ist, besonders wenn ein Spieler durch künstliche Intelligenz gesteuert werden soll. Unser Augenmerk liegt auf der objektorientierten Modellierung. Früher, zu Zeiten der prozeduralen Programmierung z.B. mit Turbo Pascal, hätte man die Position der Figuren auf dem Schachbrett z.B. in einem Array gehalten. Eine lange Liste an Prozeduren hätte dann bei jedem Zug geprüft, ob eine Schachfigur von ihrer aktuellen Position auf die neue verschoben werden darf und ob dort bereits jemand steht. Jetzt stehen uns Klassen zur Verfügung. Dadurch können wir das Ganze viel anschaulicher programmieren. Welche Klassen brauchen wir denn für das Schachspiel? Als e stes fällt ei e e utli h das “ ha h ett ei . Wofü soll die Klasse „“ ha h ett de zustä dig sei ? Sie muss wissen, welche Figur gerade auf welchem Feld steht. Außerdem muss man ihr sagen können, dass Figuren auf neue Positionen verschoben werden sollen. Und dann gibt es natürlich die Schachfiguren. Eine Schachfigur muss wissen, wer sie ist, sie muss sich auf dem Schachbrett bewegen können, und dafür muss sie die Regel kennen, in welche Richtung sie überhaupt gehen darf. Diese Dinge muss jede Figur können, egal, ob es sich um einen Bauer, einen Läufer oder einen Turm handelt. Wi e stelle also ei e Klasse „Figu , die all das ka u d weiß, was wir gerade festgestellt haben. In Delphi legt man dafür eine neue Unit an Datei – Neu – Unit. Anschließend schreibt man die Definition der Klasse in das Interface der Unit: Object Pascal im Detail - Objektorientierung www.delphi-treff.de 93 type XKoordinate = ‘a‘..‘h‘; YKoordinate = 1..8; TFigur = class private FX: XKoordinate; FY: YKoordinate; public procedure Ziehex: XKoordinate; y: YKoordinate; function IstZugErlaubtx: XKoordinate; y: YKoordinate: Boolean; end; Hier gibt es nun einiges zu sehen: Eine Klassen-Deklaration besteht aus dem Namen der Klasse hier TFigur, in Delphi gibt es die Konvention, dass Klassennamen mit einem großen T für type beginnen und dem “ hlüssel o t „ lass . Es folge e s hiede e “i ht a keits e ei he, die optio al si d hie „p i ate u d „pu li . Wenn man sie nicht braucht, kann man sie weglassen. Bei „XKoordinate und „YKoordinate handelt es sich um Teilbereichstypen, wie in Kapitel 4.5.2 beschrieben.

4.8.3. Sichtbarkeiten