Klassen in Visual FoxPro

Einführung

Eines der neuen Schlagworte, mit denen sich der nach Visual FoxPro aufsteigende Entwickler auseinandersetzen muß, ist das Wort ‘Klassen‘. Dahinter verbirgt sich eine grundlegende Konzeption der objektorientierten Programmierung.

Klassen sind die Verkörperung der Idee, einzelne Elemente, die fertig entwickelt sind, immer wieder zu verwenden. Sollte eine direkte Einbindung bestehender Programmelemente in neue Projekte nicht möglich sein, können die Klassendefinitionen als Basis für die Entwicklung neuer Elemente dienen. Für diese neuen Elemente müssen dann nur noch die Unterschiede zu bestehenden Klassen definiert werden. Diese Vorgehensweise, in der nur die Differenzen zu bereits bestehenden Definitionen identifiziert und in Programmcode umgesetzt werden müssen, kann viel Entwicklungszeit sparen, daher wird die objektorientierte Programmierung auch oft mit den Konzepten der „Rapid Application Development“ in Verbindung gebracht. Für das effiziente Entwicklen von Anwendungsprogrammen ist die durchdachte Definition von Klassen ein zentraler Aspekt.

Grundbegriffe der OOP

Objekte

Die Objekte sind zwar die Namensgeber der objekorientierten Programmierung, was aber nicht heißt, daß ihre Definition einfach und klar abzugrenzen ist. Objekte können im weitesten Sinne als Abbilder von ‘wirklichen’ Dingen - zum Beispiel Lagerfächer oder Glühlampen - betrachtet werden. Objekte werden durch ihre Eigenschaften (engl. Properties) und ihr Verhalten (Methods) charakterisiert. Sie zeigen auf bestimmte Nachrichten oder Ereignisse (Events) ein bestimmtes Verhalten (Methods).

Klassen

Klassen sind die Beschreibungen bzw. Pläne für Objekte. In der Klassendefinition wird vorgegeben, wie das aus dieser ‘Bauanleitung’ erstellte Objekt beschaffen sein soll. Die Festlegung z. B. für eine Glühbirne sagt also aus, ob die mit diesem Plan gebaute Lampe eine Schraub- oder eine Steckfassung erhält. Eine Klasse ist also nicht das gleiche wie das daraus abgeleitete Objekt.

Die Gründe, die für die Verwendung von Klassen sprechen, sind: mehrfache Verwendung von einmal entwickeltem Programmcode, Erweiterbarkeit der Funktionalität, leichtere Ausnutzung der vorhandenen Funktionalität und bessere Wartbarkeit.

Vererbung

Klassen können als Unterklassen (engl. Subclass) von bereits existierenden Klassen erzeugt werden. Die neue Klasse ist zunächst absolut identisch zu der Oberklasse (Superclass). Sie 'erbt' alle Eigenschaften und Methoden der Oberklasse. Für die neue Klasse können jedoch zusätzliche Eigenschaften und Methoden definiert werden. In einer Unterklasse können die Methoden der Oberklasse umdefiniert oder erweitert werden. Der Mechanismus der Vererbung hat zur Folge, daß in einer Subklasse nur noch die Veränderungen zur Superklasse vornomen werden müssen.

Instanziierung

Der Vorgang, aus einer Klassendefinition ein Objekt zu erzeugen, wird Instanziierung genannt. Das bedeutet, der in der Klasse abgelegte 'Bauplan' wird ausgewertet und umgesetzt. Das aus einer Klassendefinition erstellte Objekt befindet sich nach der Instanziierung mit allen in der Klassendefinition festgelegten Merkmalen im Arbeitsspeicher des Rechners und ist von der Klassendefinition selbst völlig unabhängig.

Polymorphie

In voll implementierten OO-Entwicklungsumgebungen lassen sich aus einer Klassendefinition beliebig viele Objekte zur gleichen Zeit instanziieren. Alle diese Objekte haben die gleichen Merkmale. Ihre Eigenschaften lassen sich über den gleichen Namen (mit vorangesetztem Objektnamen) referenzieren und ihre Methoden lassen sich über die gleichen Namen aufrufen.

Ereignisse (Events)

Ereignisse geschehen außerhalb des Einflusses eines Programms. Das Programm - soll es als ereignisgesteuert bezeichnet werden - muß auf die Ereignisse seiner Umgebung reagieren können. In den Klassendefinitionen lassen sich Methoden zu Ereignissen zuordnen. Damit läßt sich das Verhalten des instanziierten Objektes innerhalb des Programmablaufs vorausbestimmen. Die Ereignisse, die Visual FoxPro abarbeitet lassen sich nicht erweitern oder verändern.

Kapselung

Objekte, die einmal instanziiert sind, sind voneinander völlig unabhängig. Jedes instanziierte Objekt hat seine eigenen Eigenschaften und Methoden. Diese lassen sich von außen weder hinzufügen noch löschen. Wird ein Objekt gelöscht, bleiben alle anderen Objekte davon unbeeinflusst.

Nachrichten

Um mit Objekten kommunizieren zu können, muß ihre Referenz bekannt sein. Über diese Referenz können alle Properties des Objektes angesprochen und alle Methoden aufgerufen werden. Von jeder Stelle im Programmcode und von jedem Objekt aus kann auf jedes andere instanziierte Objekt zugegriffen werden.

Beispielprogramm zur OOP

Das folgende Beispiel illustriert die einzelnen Aspekte der objektorientierten Programmierung:

Beispielprogramm Class1.prg

Klassen

Die Hauptzwecke, für die Klassen erstellt werden, sind:

Attribute von Objekten

Die Attribute von Objekten teilen sich in zwei Gruppen: Eigenschaften (engl. Properties) und Programmcode (in OOP-Diktion Methoden, engl. Methods).

Properties

Eigenschaften sind vergleichbar mit Variablen (in der englischen Fachliteratur werden sie auch ‘member variables’ genannt).

Welche Eigenschaften ein Objekt haben wird, wird in der Klassendefinition festgelegt. Jede Klasse kann mit einer unterschiedlichen Anzahl Eigenschaften versehen werden, wobei die Visual FoxPro-Basisklassen verschiedene bereits vorgegebene Eigenschaften haben. Da sie jeweils zu einem Objekt gehören - also auch innerhalb dieses Objektes gespeichert sind - können Eigenschaften, die die gleiche Funktionalität haben, in jedem Objekt gleich benannt werden (Polymorphie), ohne sich gegenseitig zu beeinflussen (Kapselung). Diese Designmerkmale der Eigenschaften in Visual FoxPro sind kein Designgag, sondern für die Übersichtlichkeit der Programme von entscheidender Bedeutung. So läßt sich z.B. die Höhe von am Bildschirm sichtbaren Objekten immer durch die Anweisung ‘<Objektname>.HEIGHT = ...’ beeinflussen, egal von welcher Klasse das Objekt abgeleitet wurde.

Es gibt Eigenschaften, die sich zur Design- und zur Laufzeit verändern lassen, andere können nur in der Klassendefinition festgelegt werden.

Welche Eigenschaften ein Objekt haben soll, kann nur in der Klassendefinition festgelegt werden. Ist ein Objekt instanziiert, ist ein Einfügen von Eigenschaften für dieses Objekt nicht mehr möglich. Eine Klassendefinition, die auf einer bereits vorhandenen Klasse basiert, enthält immer mindestens die in der Elternklasse angelegten Eigenschaften. Diese bereits aus der Elternklasse übernommenen Eigenschaften sind nicht wieder entfernbar, es können nur neue Eigenschaften hinzukommen.

Wie auch die Namen von Klassen, Methoden und Variablen, kann der Name für Eigenschaften in Visual FoxPro nun 32 Zeichen lang sein, Groß-Kleinschreibung wird jedoch nach wie vor nicht unterschieden. Vom Entwickler definierte Eigenschaften können als geschützt definiert werden. Als geschützt definierte Eigenschaften sind, wenn das Objekt instanziiert ist, nicht mit Programmcode von außerhalb des Objektes les- oder veränderbar.

Standardeigenschaften von Visual FoxPro-Basisklassen

Jedes VFP-Objekt hat mindestens folgende Eigenschaften:

Class

Der Name der nächsthöheren Klassendefinition von der das Objekt abgeleitet wurde.

BaseClass

Der Name der VFP-Basisklasse, von der die Klassendefinition ausgeht.

ClassLibrary

Der Name der Klassenbibliothek, in der die Klassendefinition gespeichert ist.

ParentClass

Der Name der nächsthöheren benuzterdefinierten Klassendefinition, von der das Objekt abgeleitet wurde. Wenn das Objekt direkt von einer VFP-Basisklasse abgeleitet wurde, ist diese Eigenschaft leer.

Comment

Ein beliebiger Kommentar zu der Klasse.

Hinzu kommt eine je nach Klasse verschiedene Anzahl von Eigenschaften, die von Visual FoxPro vorgegebenen sind. Bei den auf dem Bildschirm sichtbaren Objekten gibt es z.B. die Eigenschaften ‘HEIGHT’ und ‘WIDTH’. Sie lassen sich auch zur Laufzeit verändern, was eine Anpassung der Objekte an sich verändernde Fenstergrößen erlaubt. Eine Aufstellung der zu den Basisklassen gehörenden Eigenschaften findet sich in der Visual FoxPro Hilfe zu jeder Klasse unter dem Eintrag ‘Eigenschaften (Properties)’.

Methoden

Programmcode, der in Klassen bzw. Objekten gespeichert ist, wird als Methode bezeichnet. Die Methoden, über die ein instanziiertes Objekt verfügen soll, müssen in der Klassendefinition angelegt werden. Wie für die Eigenschaften bietet Visual FoxPro für die Eingabe von Methoden fest eingebaute Einhakpunkte sowie die Möglichkeit neue Codeteile zu erstellen. Die Standardmethoden können auf zwei Wegen aufgerufen (getriggert) werden:

durch in Visual FoxPro auftretende Ereignisse wie Instanziierung eines Objektes (Init( )-Methode) oder Klicken des Benutzers auf ein Bildschirmelement (Click( )-Methode)

explizit per Programmcode (<Objekt>.Init( )).

Die Methoden, die zusätzlich in einer Klasse definiert wurden, können nur per Programmcode aufgerufen werden, sie können nicht in das Ereignismodell von Visual FoxPro eingeklinkt werden.

Bei der Erstellung einer Klasse aus einer bereits bestehenden Definition werden auch alle Methoden weitervererbt. Alle in der Superklasse vorhandenen Methoden stehen also auch der Subklasse zur Verfügung.

Wird in einer Klassendefinition Programmcode für eine Methode eingegeben, wird bei Starten dieser Methode nur der Code dieser Klasse ausgeführt. Die ggf. vorhandenen Anweisungen in der Methode der Superklasse können per THIS::<Methode> ausgeführt werden. Dies kann an beliebiger Stelle des Unterklassencodes geschehen.

Geschützte Methoden und Eigenschaften

In Visual FoxPro können Eigenschaften und Methoden als ‘geschützt’ (‘protected’) definiert werden. Als geschützt markierte Attribute sind zur Laufzeit nur noch mit Programmcode innerhalb des Objektes zugreifbar, d.h. geschützte Eigenschaften lassen sich nur von Methoden des eigenen Objektes lesen und schreiben und geschützte Methoden lassen sich nur aus  anderen Methoden des gleichen Objektes heraus aufrufen. Als ’protected’ markierte Eigenschaften lassen sich zur Entwurfszeit jedoch mit neuen Werten füllen.

Include-Dateien

Zu jeder Klasse läßt sich ein Headerdatei (Include-Datei) festlegen. In dieser lassen sich häufig benutzte Ausdrücke als Konstanten ablegen. In Visual FoxPro sind Include-Dateien schachtelbar, was es ermöglicht, in eine für eine Klassenbibliothek spezifische Headerdatei die Standardphrasen der FOXPRO.H-Datei einzufügen.

Visual FoxPro-Basisklassen

Auf der untersten Ebene setzt die Definition von Klassen auf den Basisklassen von Visual FoxPro auf. Die Basisklassen von FoxPro sind:

Klasse Symbol Verwendung

Kontrollkästchen (CheckBox)

wie in FP2.6

Spalte eines Datenblatts (Column)

Teil des Datenblattobjektes

Kombinationsfeld (ComboBox)

wie in FP 2.6

Befehlsschaltfläche (CommandButton)

wie in FP 2.6

Schaltflächengruppe (CommandGroup)

Gruppe von mehreren Schaltflächen

Container (Container)

Zusammenfassung von mehreren Objekten zu einer funktionalen Gruppe

Control (Control)

wie Container, aber nicht einzeln zur Designzeit bearbeitbar

Cursor (Cursor)

Teil des Dataenvironments

Custom (Custom)

Benutzerdefinierte Klasse (meist nicht visuell)

Datenumgebung (DataEnvironment)

Teil eines Formulars oder einer Formulargruppe

Bearbeitungsfeld (EditBox)

wie in FP 2.6

Formular (Form)

wie in FP 2.6

Formulargruppe (FormSet)

wie in FP 2.6

Datenblatt (Grid)

„Browse“ innerhalb eines Formulars

Spaltenkopf (Header)

Teil des Datenbalttobjekts

Abbildung (Image)

wie in FP 2.6

Bezeichnung (Label)

wie in FP 2.6

Linie (Line)

wie in FP 2.6

Listenfeld (ListBox)

wie in FP 2.6

OLE Steuerelement (OLEControl)

Einbaumöglichkeit von .OCX oder Daten aus anderen Programmen

gebundenes OLE Steuerelement (OLEBoundControl)

Sichtbarmachen von Daten in GENERAL-Feldern

Optionsfeld (OptionButton)

wie in FP 2.6

Optionsfeldgruppe (OptionGroup)

Gruppe von Optionsfeldern

Seitenrahmen (Pageframe)

mehrere umschaltbare Flächen innerhalb eines Formulars

Seite (Page)

Teil eines Seitenrahmens

Relation (Relation)

Teil des Dataenvironments

Zwischenraum (Separator)

Zwischenraum zwischen ToolBar-Objekten

Figur (Shape)

wie in FP 2.6

Drehfeld (Spinner)

Eingabe oder Einstellung von numerischen Werten

Textfeld (TextBox)

wie in FP 2.6

Zeitgeber (Timer)

Ansteuerung von periodisch wiederkehrenden Ereignissen
Symbolleiste (ToolBar) Zusammenfassung von frei auf dem Bildschirm positionierbaren Bedienelementen

Alle diese Basisklassen haben einen festgelegten Satz von Eigenschaften und Methoden. Bei der Definition von darauf basierenden Klassen lassen sich zusätzliche Attribute hinzufügen.