Session D-EOO

Einführung in die
objektorientierte Programmierung

Norbert Abb
Wizards & Builders GmbH

 


EINLEITUNG


Einleitung / Historie

Objektorientierte Programmierung ist keineswegs so neu, wie man es bei einer Beobachtung des Marktes in den letzten Jahren glauben möchte.

Erste Ansätze zu objektorientierten Programmiersprachen kamen bereits Ende der 60er Jahre in den Universitäten und der Forschung auf. Anfang der 70er Jahre wurde die Theorie zu dieser neuen Technik entwickelt. Es gab viele Sprachen, die nur auf wissenschaftlichem Gebiet eingesetzt wurden und bekannt waren. Eine der Sprachen, die damals entwickelt wurde und auch heute noch eine Bedeutung besitzt ist Smalltalk, die objektorientierte Sprache schlechthin.

Kommerzielle Bedeutung hat heute vor allem auch die Sprache C++ (Visual C), die aus C durch eine Erweiterung um die objektorientierten Elemente (Klassen, Methoden, ...) entstand.

In der letzten Zeit sind auch im Xbase Bereich einige Entwicklungen in Richtung Objektorientierung auf den Markt gekommen (VO, VdB).

Mit Visual Fox Pro hat Microsoft eine objektorientierte Xbase Sprache, in der alle Konzepte der objektorientierten Programmierung enthalten sind, auf den Markt gebracht.

 

Der Begriff der ‘objektorientierten Programmierung’ legt es nahe sich zuerst mit dem Begriff ‘Objekt’ zu beschäftigen. Was sind also Objekte und wodurch zeichnen sie sich aus?

In einer objektorientierten Programmiersprache können ‘natürliche Objekte’ durch Konstrukte der Sprache dargestellt werden. Objekte zeichnen sich durch Eigenschaften und ihr ‘Verhalten’ aus.

Objekte werden durch ihre Eigenschaften (Properties) beschrieben. Ein bestimmtes Objekt hat also bestimmte Eigenschaften, die es genau(er) beschreiben.

Nehmen wir ein Beispiel aus der Realität. Ein Auto kann beispielsweise mit Eigenschaften beschrieben werden:

 

Man erkennt zum einen werden sichtbare Eigenschaften beschrieben zum Anderen aber auch Zustände wie ‘Motor läuft’ und ‘Licht eingeschaltet’.

Methoden sind Aktionen, mit denen Objekte auf Ereignisse (Events) von außen oder auf Messages von anderen Objekten ‘reagieren’.

Bleiben wir beim Beispiel: Die Methode ‘Anlassen’ bringt den Zustand Motor läuft von ‘Nein’ (oder .F.) auf ‘Ja’ (oder .T.).

Methoden können auch komplexere Aktionen auslösen. So könnte man sich eine Methode ‘Fahren’ vorstellen (auf einer hohen Abstraktionsebene), die zwei Parameter ‘Von’ (Hamburg) und ‘Nach’ (München) erhält und das Auto von Hamburg nach München bewegt. In der Programmierung kann man Methoden als Prozeduren oder Funktionen sehen, die Aktionen mit ihren Objekten ausführen.


Klassen / Klassenhierarchie

Klassen sind das eigentliche Hauptelement der Objektorientierten Programmierung. Objekte werden zu Klassen ‘zusammengefaßt’. Diese Bild stimmt nicht ganz. Das kann man höchstens in der Analyse so sehen. Denn normalerweise existieren die Klassen und die Objekte sind nur Ausprägungen davon.

Objekte gehören einer bestimmten Klasse an. In der Klasse werden die Arten der Eigenschaften festgelegt, die ein Objekt beschreiben. Objekte sind Ausprägungen (Instanzen) von Klassen. Das bedeutet für unser obiges Beispiel: Die Klasse Auto legt fest daß ein Auto beschrieben wird, durch die Eigenschaften: Marke, Typ, Farbe, Anzahl Türen, Leistung, usw..

In der Klassendefinition werden außerdem die Methoden festgelegt, die für Objekte der Klasse ausgeführt werden können. Diese Methoden sind Prozeduren oder Funktionen, die für die Objekt der Klasse ausgeführt werden können. Sie bestimmen sozusagen das ‘Verhalten’ der Objekte dieser Klasse. So bestimmt z.B. der Code in der ‘Click’ Methode zu einem Command Button, wie sich der Button verhält bzw. was passiert, wenn auf den Button geklickt wird.

Ein bestimmtes Objekt entsteht durch die Instanziierung der Klasse. Dies geschieht in VFP durch ein

CreateObject ist die Funktion, die ein Objekt ‘erstellt’. Die Eigenschaften des Objekts können dann besetzt werden:

In anderen Programmiersprachen heißt der Befehl zur Instanziierung oft ‘New’:

Klassen können definiert werden auf der Basis von bereits vorhandenen Klassen. Das können ‘Basisklassen’ der jeweiligen Programmiersprache sein, oder benutzerdefinierte Klassen. Dieses ‘Subclassing’ kann mehrfach wiederholt werden. Dadurch entstehen Klassenhierarchien. Bei unserem Beispiel ‘Auto’ könnte das (auszugsweise) folgendermaßen aussehen:
Fahrzeuge (Höchstgeschwindigkeit, Nutzlast)
/
Landfahrzeuge
(Anzahl Räder)
|
Wasserfahrzeuge
...
\
Luftfahrzeuge
...
/
Motorfahrzeuge
(Leistung, Motor an)
\
Muskelkraftfahrzeuge
   
|
Autos (Marke, Typ,...)

Beim ‘Subclassing’ erben die Klassen die Eigenschaften und Methoden (hier nicht dargestellt) von ihren Oberklassen (Parentclass). Es können aber weitere Eigenschaften (und Methoden) neu dazu definiert werden. Außerdem können Methoden beim ‘Subclassing’ umdefiniert werden (mit anderem Code). Wenn dies nicht geschieht, wird implizit der Code der Oberklasse verwendet.

Es ist wichtig zwischen der Klassen- und der Objekthierarchie zu unterscheiden. Während bei der Instanziierung eines komplexen Objektes diese Objekt mehrere Andere enthält, die alle zur Laufzeit vorhanden sind, ist von den ‘darüberliegenden Klassen’ eigentlich nichts vorhanden. Nur für den Fall, daß in der instanziierten Klasse kein Code vorhanden ist wird auf den Code der Oberklasse zurückgegriffen.

Eine Klassenhierarchie entsteht durch diese Vererbung (Subclassing). Wie bereits erwähnt, wird bei einem Fehlen von Code in einer Methode, der Code der darüberliegenden Klasse (Parentclass) ausgeführt, wenn diese auch keinen Code besitzt wird die Methode der über dieser liegenden Klasse verwendet usw..

Wichtig ist, daß es bei bestimmten Methoden Default Verhalten in den Visual FoxPro Basis Klassen gibt. Den Code dafür kann man in VFP nicht sehen und verändern. Man kann lediglich dafür sorgen, daß der Default Code nicht ausgeführt wird. Dies geschieht mit dem Schlüsselwort ‘Nodefault’ in der jeweiligen Methode.

Wenn man nun in einer Methode den Code der darüberliegenden Klasse verwenden möchte, und noch neue Programmteile dazufügen möcht so geschieht das nicht durch kopieren des Codes sondern durch explizite Bezugnahme auf den Code der Parentclass mit dem ‘::’ Operator. Dies kann mitten im Code der Methode geschehen:

Es kann auf diese Weise nur Code in Klassen angesprochen werden, die auch tatsächlich in der Klassenhierarchie über der Klasse, in der sie verwendet werden liegt.

Mit ‘this’, ‘thisform’, ‘thisformset’ wird auf das aktuelle Objekt bzw. die aktuelle Maske oder das aktuelle Maskenset Bezug genommen. Z.B. This.Farbe = ‘Rot’ setzt die Eigenschaft Farbe des aktuellen Objekts auf ‘Rot’. Diese Schreibweise kann nur in Methoden angewandt werden, da nur hier ‘This’ einen eindeutigen Bezug findet. In anderen objektorientierten Sprachen heißt das Schlüsselwort dafür oft ‘self’.

Auf Objekte in der Objekthierarchie kann man in den Methoden zugreifen, indem man sie qualifiziert. Die verschiedenen ‘Stufen’ der Hierarchie werden durch Punkte getrennt. Eine ‘Adressierung’ kann entweder absolut erfolgen oder relativ.

Absolut bedeutet, es wird die gesamte Objekthierarchie angegeben:

Man sieht, daß diese Art von Zugriff recht umständlich werden kann. Eine Hilfe dabei bietet das ‘With’ statement. Damit ist möglich die Schreibweise abzukürzen wenn man mehrere Zuweisungen hintereinander machen möchte:

Auf diese Weise können nicht nur Eigenschaften, sondern auch Methoden des Objekts angesprochen werden (siehe .Refresh()).

Objekte können auch relativ angesprochen werden und zwar über ihre Lage in der Objekthierarchie:

Dieser Befehl im Click eines Buttons auf einer Seite eines Pageframes bewirkt eine Änderung der Caption der Seite.


VFP Klassen

Hier sollen die Klassen kurz genannt werden, die Visual FoxPro schon als Basisklassen ‘mitbringt’. Auf diesen Basisklassen müssen alle Klassen, die vom Benutzer (Programmierer) definiert werden aufbauen.

Klassen die selbst keine Objekte beinhalten können werden Nicht Container Klassen genannt. Diese Klassen sind: CheckBox, ComboBox, CommandButton, Custom, EditBox, Header, Image, Label, Line, ListBox, Shape, Spinner, TextBox, Timer

Containerklassen können Objekte enthalten. Das bedeutet, es können Objekte von anderen Klassen (oder auch der gleichen Klasse) in der Klasse (bzw. dem Objekt) enthalten sein. Durch Container kommt die oben beschriebene Objekthierarchie zustande. Zum Beispiel können Pageframes auf ihren Seiten weitere (komplexe) Controls enthalten.

Container Klassen sind: Container, CommandGroup, Control, FormSet, Form, Grid, Column, OptionGroup, PageFrame, Page, ToolBar


Weitere wichtige Begriffe der OOP

Polymorhismus bedeutet, daß in verschiedenen Klassen eine Methode mit gleichem Namen, aber anderem Inhalt bestehen kann. Wenn nun die Methode für ein instanziiertes Objekt angewandt wird, so muß nicht bekannt sein zu welcher Klasse das Objekt gehört. Das System findet die ‘richtige’ Methode. So könnte beispielsweise für eine Liste eine ‘Start’ Methode existieren, die auf den Anfang der Liste positioniert und in einer Stoppuhr eine Methode ‘Start’ existieren, die die Zeit loslaufen läßt. Dies wäre ein schlechtes Beispiel für einen Polymorphismus. Nützlich wird Polymorhismus vor allem in einander ähnlichen Klassen. Nehmen wir an es gibt in einem System einige verschiedene Formulare. Dann könnte man für jede der Formularklassen eine Methode ‘Drucken’ definieren, die das jeweilige Formular ausdruckt. Wenn man nun ein Objekt irgendeiner dieser Klassen drucken möchte, so braucht man sich nicht darum zu kümmern welcher Art das aktuelle Formular ist. Der Befehl wäre immer:

So eingesetzt bringt der Polymorhismus Vorteile in der Programmierung.

Events sind Ereignisse, die in der Umgebung von Objekten passieren. Wie Objekte darauf reagieren, ist in den Event-Methoden der jeweiligen Klasse abgelegt.

Zum Beispiel kann mit dem Click Event bei einem Cancel Button ein thisform.release() ausgelöst werden um die jeweilige Maske zu beenden.

Mit Event wird bei VFP oft auch die zum Event gehörende Methode gemeint (die Trennung ist hier nicht besonders scharf). So ist mit ‘ClickEvent’ oft das gemeint, was in der Methode zum Click Event steht. ‘Reine Methoden’ unterscheiden sich von den Events dadurch, daß sie nicht durch (System)Ereignisse ausgelöst werden können, sondern lediglich durch den expliziten Aufruf im Code, quasi als Funktion.

Der Begriff kommt aus der OOP Theorie und bezieht sich darauf, daß Objekte untereinander durch Nachrichten ‘kommunizieren’.

‘sendet’ an den Pageframe MyPageframe die Nachricht, daß ein Refresh ausgelöst werden soll. Für den VFP Programmierer stellt sich dies eher als ein Befehl oder Funktionsaufruf dar.


Beispiel: Stopwatch

Das Beispiel ‘Stopwatch’ ist in den Samples (Controls) zu VFP zu finden. Es wird an diesem Beispiel gezeigt wie man durch Vererbung Funktionalität erweitern kann und wie/daß sich Änderungen an der Parentclass auswirken.

Die Beispiele im Controls Projekt in den Beispielen zu Visual FoxPro eignen sich hervorragend um in die Techniken (OOP, neue Controls, VFP allgemein) einen Einblick zu bekommen. Sie sind als Einstieg viel besser geeignet, als das ‘Tastrade’ Projekt.