Session D-EOO
Einführung in die
objektorientierte Programmierung
Norbert Abb
Wizards & Builders GmbH
EINLEITUNG
Die Session ist als Einführung in die objektorientierte Programmierung gedacht und wendet sich hauptsächlich an Neulinge der OOP. Es wird aufgezeigt woher der Begriff der Objektorientierung kommt und die Entwicklung der objektorientierten Sprachen dargestellt. Es werden wichtige Grundbegriffe der OOP erläutert, wie: Klassen, Objekte, Vererbung, Hierarchien, Polymorphismus. An Beispielen wird gezeigt, wie diese Konzepte in VFP realisiert sind. Die verschiedenen Arten von Klassen in VFP und die VFP Basisklassen werden vorgestellt und erläutert. Es wird gezeigt welche Vorteile OOP dem Anwendungsentwickler (und auch dem Anwender) bringt.
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.
Objekte
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.
Eigenschaften
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:
Marke: VW
Typ: Golf
Farbe: Rot
Türen: 4
Leistung: 79 KW
Pol. Kennzeichen: F-P 30
Motor läuft: Nein
Licht eingeschaltet: Nein
...
Man erkennt zum einen werden sichtbare Eigenschaften beschrieben zum Anderen aber auch Zustände wie Motor läuft und Licht eingeschaltet.
Methoden
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.
Klassen
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.
Instanziierung
Ein bestimmtes Objekt entsteht durch die Instanziierung der Klasse. Dies geschieht in VFP durch ein
oMeinObjekt = CREATEOBJECT(CommandButton)
CreateObject ist die Funktion, die ein Objekt erstellt. Die Eigenschaften des Objekts können dann besetzt werden:
oMeinObjekt.FontName = Arial.
In anderen Programmiersprachen heißt der Befehl zur Instanziierung oft New:
<oAuto := Auto.New()>.
Vererbung
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.
Klassenhierarchie <-> Objekthierarchie
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.
Klassenhierarchie
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:
(in der Click Methode)
Elternklasse::Click
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.
this / thisform / thisformset
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.
Objekthierarchie
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:
OMeineMaske.MeinPageframe.ErsteSeite.Caption = Seite 1
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:
WITH oMeineMaske.MeinPageframe.ErsteSeite
.Caption = Seite 1
.FontName = Arial
.
.
.Refresh()
ENDWITH
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:
This.Parent.Caption = Rela tief
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.
Nicht Container
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
Container
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
Polymorphismus
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:
oAktuellesFormular.Drucken()
So eingesetzt bringt der Polymorhismus Vorteile in der Programmierung.
Events
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.
Nachrichten / Messages
Der Begriff kommt aus der OOP Theorie und bezieht sich darauf, daß Objekte untereinander durch Nachrichten kommunizieren.
Thisform.MyPageframe.Refresh()
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.