Objektorientiert: Unterschied zwischen den Versionen

Aus Wiki des Deutschsprachige Xbaseentwickler e. V.
Zur Navigation springen Zur Suche springen
Keine Bearbeitungszusammenfassung
Keine Bearbeitungszusammenfassung
Zeile 52: Zeile 52:


Die Instanzvariable :cargo ist sicherlich ein interessantes Vehikel, man stösst aber gerade bei komplexeren Anwendungen oft an die Grenzen, was man :cargo zumuten kann. Dann macht es Sinn, bestimmte Klassen abzuleiten und in der eigenen Klasse dann zusätzliche Instanzvariablen zu definieren, um Informationen zu speichern, die für die Verarbeitung wichtig sind.
Die Instanzvariable :cargo ist sicherlich ein interessantes Vehikel, man stösst aber gerade bei komplexeren Anwendungen oft an die Grenzen, was man :cargo zumuten kann. Dann macht es Sinn, bestimmte Klassen abzuleiten und in der eigenen Klasse dann zusätzliche Instanzvariablen zu definieren, um Informationen zu speichern, die für die Verarbeitung wichtig sind.
== self: ==
== Klassen-Variablen und -Methoden ==
=== Klassen-Variablen ===
=== Klassen-Methoden ===


(Artikelinarbeit)
(Artikelinarbeit)

Version vom 12. Juni 2013, 19:32 Uhr

Objekte

"Was ist ein Objekt?"
"Das, was man draus macht."
(Dialog zweier unbekannter Programmierer)

Clipper brachte mit TBrowse() und Error() die ersten Objekte ins Spiel. Zu dieser Zeit war es nicht möglich, eigene Objekte zu definieren (und zu verwenden). Mittels Class(y) konnte man allerdings eigene Objekte erstellen und verwenden.

Ein Objekt ist eine Kombination aus Daten (= Instanzvariablen) und Programmcode (= Methoden), die einem bestimmten Zweck dienen (oder auch mehreren, je nach Definition).

Der Vorteil eines Objektes ist, dass es sich dabei einmal um "gekapselten" Code handelt, auf den man von aussen keinen Einfluss nehmen kann (ausser dem, den der Programmierer vorgesehen hat).

Dieser Code kann (normalerweise) auch von einem Programm zum nächsten mitgenommen werden und sollte - im Idealfall - einfach neu verwendet (re-used) werden.


Zum anderen stellen die Instanzvariablen auch eine gute Dokumentation dar.

nErgebnis := TueIrgendEtwas(nValue, nPieces, nPrice, nCount, cName, @nBonus)

Dieser Funktionsaufruf vermittelt einen Eindruck (!) davon, was TueIrgendEtwas() machen könnte. Um das genau festzustellen, muss man aber einen Blick in den Quellcode von TueIrgendEtwas() werfen.

oClass := TueIrgendEtwas():new()
oClass:Menge    := nValue
oClass:Anzahl   := nPieces
oClass:EKPreis  := nPrice
oClass:Position := nCount
oClass:ArtName  := cName
oClass:calculate()
nErgebnis := oClass:Positionspreis
nBonus    := oClass:Positionsrabatt

Eine Dokumentation setzt immer voraus, dass Zeit (und Lust) dafür vorhanden sind. Wenn die Instanzvariablen einer Klasse sauber beschrieben sind, muss man zum einen nicht befürchten, Parameter in ihrer Reihenfolge vertauscht zu haben, sondern man erkennt die Bedeutung eines Parameters.

Klar, man könnte alle Parameter auch an :calculate() übergeben, damit würde man von der Parameter-Bedeutung aber nicht unbedingt viel gewinnen.

Dazu kommt, dass der Aufruf einer Methode generell ein Ergebnis zurückliefert (wie jede andere Funktion auch), aber wir können Instanz-Variablen benutzen, um weitere Ergebnisse bereitzustellen. Man denke nur an die drei ersten Parameter von AppEvent(), die per reference übergeben werden müssen, um mehr als das Standard-Ergebnis zu erhalten.

Ob man eigene Klassen einsetzt, ist mehr oder weniger eine Geschmacksfrage (oder eine Frage der Vorgaben).


Vererbung

Klassen kann man vererben, oder genauer gesagt, man kann von einer Klasse (auch von mehreren Klassen) neue Klassen ableiten.

Die abgeleiteten Klassen "erben" erst einmal den Aufbau der ursprünglichen Klasse (hier kann durchweg der Plural gesetzt werden, wenn ich im folgenden aus Gründen der Vereinfachung den Singular verwende).

Ziel kann z.B. eine kombinierte Klasse sein. Ein Beispiel dafür ist die XbpComboBox() Klasse, die sich darstellt als eine Kreuzung der XbpListBox() Klasse mit der XbpSLE() Klasse.

Ein anderes Ziel ist es, zusätzliche Methoden oder Instanzvariablen zu implementieren, die man über die vorhandenen Methoden oder Instanzvariablen hinaus benötigt:

Die Instanzvariable :cargo ist sicherlich ein interessantes Vehikel, man stösst aber gerade bei komplexeren Anwendungen oft an die Grenzen, was man :cargo zumuten kann. Dann macht es Sinn, bestimmte Klassen abzuleiten und in der eigenen Klasse dann zusätzliche Instanzvariablen zu definieren, um Informationen zu speichern, die für die Verarbeitung wichtig sind.


self:

Klassen-Variablen und -Methoden

Klassen-Variablen

Klassen-Methoden

(Artikelinarbeit)