Klassen und OOPAlf Borrmann Mit Visual FoxPro hält die objektorientierte Programmierung - nachfolgend kurz OOP genannt - Einzug in die FoxPro-Anwendungsentwicklung. Im Gegensatz zu "objektbasierten" Entwicklungssystemen enthält Visual FoxPro eine komplette Implementierung der Objektorientierung. Ein Kernstück der OOP sind die Klassen, die benötigt werden, um aus ihnen die Objekte abzuleiten. Komplette Implementierung von OOP bedeutet für die Klasssen, daß ihre Eigenschaften und Methoden - im folgenden auch Merkmale oder Attribute genannt - über mehrere Ebenen vererbbar sind, daß Klassen selbst definierbar sind und daß in Klassen Objekte aus bereits bestehenden Klassendefinitionen eingefügt werden können. Was sind Klassen?Eine Klasse ist die Definition aller Attribute, die ein aus dieser Klasse abzuleitendes - in der Fachsprache: "instanziertes" - Objekt erhalten soll. Die Erstellung eines Objekts erfolgt in Visual FoxPro mit der Funktion "CREATEOBJECT()". Hierbei erhält das Objekt alle in der Klassendefinition vorhandenen Merkmale. Diese Merkmale bestehen aus Daten (Eigenschaften), Programmcode (Methoden) und eingefügten Objekten. Die Daten, die in den Objekten gespeichert werden, sind von den Daten der anderen Objekte getrennt (Kapselung). Bei Bedarf lassen sich die einzelnen Daten gegen einen Zugriff außerhalb des Objektes sperren, wodurch sie nur über den Programmcode (Methoden), der innerhalb des Objektes vorhanden ist, les- und veränderbar sind. Durch diese Zusammenhänge läßt sich in der Klasse ein für das Objekt spezifisches Verhalten vorausbestimmen. Klassendefinitionen lassen sich aus bereits vorhandenen Klassen ableiten. Die Klasse, aus deren Definition die neue Klasse gebildet wurde, ist die Elternklasse (Superclass), die abgeleitete die Kindklasse (Subclass). Der im Englischen gebräuchliche Begriff sagt dabei nichts über die Merkmale einer Klasse, sondern lediglich etwas über die "Erbfolge" aus. Eine Subclass besitzt nicht nur ein "Subset", sondern alle Merkmale der Superclass. Zu den bereits vererbten Attributen können dann noch zusätzliche Merkmale hinzugefügt werden. Das Hinzufügen von Eigenschaften und Methoden zur Subclass wirkt sich dabei nicht auf die Superclass aus. Wofür sind Klassen einsetzbar?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. Die Hauptzwecke, für die Klassen erstellt werden, sind:
das "Einpacken" von Funktionalität, die es auch ohne Klassendefinition gäbe, in eine "Paketklasse" (z.B.: eine Klasse mit Methoden, die die Funktionalität der SYS()- oder der SET()-Funktion bereitstellen) Auf der untersten Ebene setzt die Definition von Klassen auf den Basisklassen von Visual FoxPro auf. Eine übersicht über die Basisklassen finden Sie in der nachfolgenden Tabelle.
Die Basisklassen haben einen vorgegebenen Satz von Eigenschaften und Methoden. Bei der Definition von darauf basierenden Klassen lassen sich zusätzliche Attribute hinzufügen. Visual FoxPro stellt zwei Möglichkeiten zur Bearbeitung von Klassendefinitionen zur Verfügung: die visuelle Bearbeitung (Visual Class Designer, Visual Class Brower) und die klassische Eingabe von Programmcode. Visuelle Werkzeuge Visual Class DesignerDie Erstellung von visuellen Klassen - Auswahllisten, Schaltflächen etc. - ist am einfachsten über den Visual Class Designer vorzunehmen. Mit dem Visual Class Designer ist auch die Definition von nicht-visuellen Klassen möglich. Der Aufruf des Visual Class Designers erfolgt über die Menüauswahl DATEI-NEU-Klasse. Alternativ ist im Befehlsfenster der Befehl "CREATE CLASS" einzugeben. Das nun folgende Dialogfenster erwartet die Eingabe des Namens der neuen Klasse, Basisklasse und in welcher Klassenbibliothek die neue Definition abzuspeichern ist. Anschliessend erscheint der Class Designer mit einer leeren Klassendefinition vom Typ der gewählten Basisklasse. Die änderung bestehender Klassen ist über die Menüauswahl "DATEI-öFFNEN-Klassenbibliothek" und anschliessender Auswahl der Klasse vorzunehmen. Natürlich steht auch ein entsprechender Befehl in Visual FoxPro zur Verfügung: "MODIFY CLASS ... OF ...". Der Klassendesigner ist dem Formulardesigner (Maskendesigner) sehr ähnlich, tatsächlich lassen sich im Formulardesigner erstellte Formulare als Klasse speichern. Die definierten Klassen sind jedoch in einer Datei mit der Erweiterung .VCX abgespeichert. Diese Dateien dienen als Bibliotheken und können beliebig viele Klassendefinitionen aufnehmen. Das Hinzufügen von Eigenschaften und Methoden erfolgt über die Menüauswahl KLASSE-Methode/Eigenschaft hinzufügen. Die definierten Eigenschaften und Methoden sind im Eigenschaftsfenster (Property Sheet) dargestellt. Die hinzugefügten Attribute erscheinen immer am unteren Ende der entsprechenden Seite des Eigenschaftsfensters. Unterschiede zum FormulareditorMit dem Formulareditor werden Formulare erstellt, die auf zuvor definierten Klassen basieren bzw. diese beinhalten. Im Class Designer sind jedoch keine vom Formulareditor als Formular gespeicherten Objekte änderbar. Die Strukturen der .VCX-Datei und der .SCX-Datei, in der die Formulardefinitionen abgelegt sind, sind sich sehr ähnlich. Deshalb besteht in Visual FoxPro die Möglichkeit, Formulare, Steuerelemente und Steuerelementgruppen als Klasse abzuspeichern. Dies erfolgt über das Dialogfenster, das nach der Menüauswahl "DATEI-Speichern als Klasse..." erscheint. Hier ist wieder die Bibliothek und der Klassenname für die zu speichernde Klassendefinition anzugeben. Visual Class Browser In der Professional Edition von Visual FoxPro ist ein Tool - der Class Browser - zur Darstellung von Zusammenhängen der Klassenhierarchien einer Klassenbibliothek enthalten. Der Class Browser ist eine in FoxPro geschriebene Anwendung. Er ist nicht im Systemmenü von FoxPro erreichbar, sondern installiert erst beim erstmaligen Aufruf des Programms - do browser.app - die Option "Klassenkatalog" unter dem "Extras"-Menü. Nach dem Aufruf des Class Browsers ist die zu öffnende Klassenbibliothek anzugeben. Im oberen Fensterbereich des Class Browsers erscheinen anschließend alle in dieser Bibliothek enthaltenen Klassen. Mit Hilfe des Kombinationsfeldes "Typ" lassen sich die anzuzeigenden Klassen filtern. Links oberhalb der Klassenliste zeigt ein Icon an, von welcher Basisklasse die aktuell angewählte Klasse abgeleitet ist. Ein Doppelklick auf eine Klasse ruft den Visual Class Designer zum Bearbeiten dieser Klasse auf. In der hierarchischen Darstellung ist an dem Plus-Zeichen (+) erkennbar, ob von dieser Klasse weitere Klassen abgeleitet sind. Ein Klick auf das Pluszeichen erweitert die Darstellung um eine Hierarchiestufe. Anschließend erscheint ein Minus-Zeichen vor der Elternklasse. Die Elternklasse ist durch einen Doppelklick auf das Ordnersymbol der Kindklasse anwählbar. Ist die Elternklasse in einer anderen Klassenbibliothek gespeichert, dies wird durch "«" hinter dem Ordnersymbol angezeigt, startet FoxPro eine neue Instanz des Class Browsers und lädt die Klassenbibliothek der Elternklasse. Unter der Klassenliste befindet sich ein Seitenrahmen (PageFrame), der dem Eigenschaften-Fenster des Classdesigners ähnelt. Hier sind die zusätzlich zu der Basisklasse definierten Merkmale angezeigt. Zusätzlich erscheint im rechten unteren Textfeld der eingegebene Kommentar zu dem Merkmal. Die einzelnen Merkmale sind in dieser übersicht jedoch nicht editierbar. Klassendefinition per ProgrammcodeWie in FoxPro 2.6 sind alle Funktionen der Entwicklungsumgebung auch als Sprachkonstrukte vorhanden. Visual FoxPro stellt für die programmatische Manipulation von Klassen verschiedene Befehle zur Verfügung. Die Anweisung zum Definieren von Klassen innerhalb eines Programmes erfolgt mittels "DEFINE CLASS ... AS ... - ENDDEFINE". Diese Befehlskonstruktion ist analog zu der Anweisung "IF ... - ENDIF": Alle zu der Klasse gehörenden Anweisungen müssen zwischen diesen Befehlswörtern stehen. In der Klassendefinition können andere Klassen, Eigenschaften und Methoden aufgeführt sein. Eigenschaften sind in einer Klassendefinition wie Variablen aufzuführen: "EigenschaftsName = <Wert>". Die Anweisung zum Einfügen von anderen Klassen lautet: "ADD OBJECT ... CLASS ...". Mit ihr lassen sich Objekte aus Klassen einfügen, deren Definition zur Laufzeit verfügbar sein muß. Die Anweisungen für die Methoden (PROCEDURE - ENDPROC/ FUNCTION - ENDFUNC) bilden mit ihren Schlüsselworten wiederum einzelne Blöcke, in denen der Programmcode für Prozeduren und Funktionen abgelegt wird. InstanzierungDie Befehlszeile "<Objektname> = CREATEOBJECT( <Klassenname>)" erstellt ein Objekt aus einer Klassendefinintion. Voraussetzung ist, daß die Klassendefinition in einem Programm zur Verfügung steht. Dies ist der Fall, wenn die Prozedurdatei, in der die Klassendefinition aufgeführt ist, im Hauptspeicher vorhanden oder mit "SET LIBRARY TO ... ADDITIVE" als Prozedurdatei geladen ist. Klassenbibliotheken (*.VCX-Dateien) sind mit dem Befehl "SET CLASSLIB TO ... ADDITIVE" zu laden. Das Objekt erhält alle Eigenschaften und Methoden, die in der Klassendefinition festgelegt sind. Das Ansprechen der Eigenschaften ist mit folgender Syntax "<Objektname>. <Eigenschaftsname> = ..." bzw. "?<Objektname>. <Eigenschaftsname>" möglich. Der Aufruf von Methoden in dem Objekt erfolgt mit "<Objektname>. <Methodenname>()". Das Freigeben der Objekte aus dem Speicher ist mit dem Befehl "RELEASE .." vorzunehmen. Sind die Variablen des Typs Objekt als private oder local definiert, werden sie nach Beenden der entsprechenden Prozedur aus dem Speicher entfernt. ZusammenfassungObjektorientierte Programmierung verändert den gesamten Ablauf der Entwicklungsarbeit. Die prozedurale Programmierung erforderte die meiste Zeit für die Erstellung der einzelnen Programmodule. In der OOP dürfte ein Großteil der Zeit dazu aufzuwenden sein, einzelne, wiederbenutzbare und möglichst flexible Klassen zu entwerfen, aus denen dann ein Gesamtsystem aufbaubar ist. Alf Borrmann ist Spezialist für technisch orientierte Datenbankanwendungen. Er ist Gesellschafter bei der Wizards & Builders GmbH. Sie erreichen ihn unter der CIS-ID 100023,1235. CopyRight © 1996 by dFPUG c/o ISYS GmbH bzw. beim entsprechenden Verfasser |