Your Browser is not longer supported

Please use Google Chrome, Mozilla Firefox or Microsoft Edge to view the page correctly
Loading...

{{viewport.spaceProperty.prod}}

Grundbegriffe des objektorientierten Programmierens

&pagelevel(4)&pagelevel

Objektorientierte Software-Entwicklung stützt sich auf einige Schlüsseltechniken, die es ermöglichen, Softwaresysteme verstehbar, änderbar und wiederverwendbar zu gestalten.
Die wesentlichsten sind:

  • Definieren von Objekten, die Botschaften austauschen

  • Bilden von möglichst allgemein verwendbaren Klassen

  • Nutzen der Vererbung als Strukturierungsmittel und zum Vermeiden von Mehrfachimplementierungen

  • Verwenden von so genannten virtuellen Methoden, wie Polymorphie und „late binding“, zur konkreten Spezialisierung.

Ein klassisch programmiertes Anwendungssystem besteht grundsätzlich aus einem Algorithmus und einer Datenstruktur. Bei einem objektorientierten Anwendungssystem sind Daten nur mehr indirekt durch Funktionen modifizierbar.
Im Folgenden werden Grundideen des objektorientierten Progammierens erläutert.

Objekte

Ein Objekt wird durch eine Klasse definiert. Es besteht aus einer Kombination von Daten und Funktionen. Diese Funktionen heißen Methoden des Objektes. Objekte kommunizieren untereinander durch den Austausch von Botschaften. Botschaften werden durch das Aufrufen von Methoden gesendet.
Jedes Objekt bekommt bei seiner Erzeugung eine Objektreferenz zugewiesen, durch die es für seine gesamte Lebensdauer eindeutig identifizierbar ist.

Klassen

Eine Klasse beschreibt durch die Klassendefinition eine Menge von Objekten mit ihren Attributen und Methoden.

Objektreferenzen

Eine Objektreferenz ist ein implizit oder explizit definiertes Datenelement. Der Inhalt der Objektreferenz verweist eindeutig auf ein Objekt und seine zugehörigen Informationen.Implizit definierte Objektreferenzen sind die vordefinierten Objektreferenzen und Objektreferenzen, die von einer Objektsicht (object-view) zurückgegeben werden. Explizit definierte Objektreferenzen sind Datenelemente, die durch eine Datenerklärung definiert werden, die eine USAGE OBJECT REFERENCE-Klausel spezifiziert.

Vordefinierte Objektreferenzen

Eine vordefinierte Objektreferenz ist ein implizit erzeugtes Datenelement, auf welches einer der Bezeichner NULL, SELF oder SUPER verweist.

Objektinstanzen

Soll ein neues Objekt erzeugt werden, legt das System eine neue Kopie der Attribute der Klasse an und erzeugt damit eine Objektinstanz. Die Methoden dieser Klasse gelten dann auch für dieses neue Objekt.

Fabrikobjekte (Factory-Objects)

In OO-COBOL enthält jede Klasse ein und nur ein spezielles Objekt, das so genannte Fabrikobjekt. Es wird durch die FACTORY-Definition der Klasse festgelegt. Das Fabrikobjekt ist verantwortlich für das Erzeugen von Objektinstanzen (Objekte) einer Klasse.

Methoden

Methoden sind Operationen, Funktionen und Anweisungen, die ein Objekt ausführen kann.

Vererbung

Die zu Grunde liegende Idee besteht darin, eine Klassenhierarchie, geordnet vom „Allgemeinen“ zum „Speziellen“, so zu nutzen, dass die „unten“ angesiedelten Klassen von den darüberliegenden Klassen, deren Methoden und Attribute erben können. Das Konzept der Vererbung verhindert eine Vervielfachung des Codes für gleiche Anwendungen.Eine Klasse kann von mehreren anderen Klassen erben. Dieser Vorgang heißt Mehrfachvererbung.

Polymorphismus

Polymorphismus bedeutet, dass die gleiche Botschaft, die an verschiedene Objekte geschickt wird, abhängig vom Typ des Objektes, verschiedene Aktionen auslöst d.h. unterschiedliche Methoden aufrufen kann, sofern deren Schnittstelle identisch ist.

Schnittstellen

Jedes Objekt besitzt eine Schnittstelle, bestehend aus dem Namen und den Parameterspezifikationen für jede Methode eines Objektes, einschließlich der geerbten Methoden.Jede Klasse verfügt über zwei Schnittstellen: eine für das Fabrikobjekt und eine Schnittstelle für die anderen Objekte.

Interface

OO-COBOL stellt das Sprachmittel Interface bereit, um eine Schnittstelle - losgelöst von einem konkreten Objekt bzw. einer konkreten Klasse - zu beschreiben. Dabei ist es nicht erforderlich, die komplette Schnittstelle eines Objekts in einem Interface festzuhalten; vielmehr können mit Hilfe eines Interface, das nur den gemeinsamen Teil der Schnittstellen von nicht verwandten Klassen beschreibt, Objekte dieser verschiedenen Klassen einheitlich verarbeitet werden.

Konformität

Konformität ist eine nicht umkehrbare Relation zwischen zwei Schnittstellen und zwischen einem Objekt und einer Schnittstelle.
Konformität ist eine der Grundlagen für die Anwendung von wesentlichen Merkmalen, wie z.B Vererbung und Interfacedefinitionen.
Besteht Konformität zwischen zwei Klassen, so können alle Schnittstellen der einen Klasse auch in der anderen verwendet werden.
Konformität ist an bestimmte Regeln gebunden, die grundsätzlich zur Übersetzungszeit abgeprüft werden. Wird allerdings eine Objektsicht (object-view) verwendet bzw. eine Methode für eine universelle Objektreferenz aufgerufen, so findet diese Überprüfung erst zur Laufzeit statt.

Schematische Beispiele

Beispiel 12-19

für Polymorphismus, late binding

Klasse A                        {M(A)} Menge der verfügbaren Methoden
  Methode M
     Display ’AAA’

Klasse B inherits A             {M(B)} Menge der verfügbaren Methoden
    Methode M override
          Display ’BBB’

Nutzerprogramm

01 aref usage object reference A      a)

    invoke B ’NEW’ returning aref       b)
    invoke aref ’M’ c)

                Ausgabe -> BBB

    invoke A ’NEW’ returning aref d)
    invoke aref ’M’’

                Ausgabe -> AAA

Anmerkungen

  1. Eine Objektreferenz, die auf Objekte der Klasse A und aller Klassen, die davon erben, zeigen kann.

  2. aref zeigt auf ein Klasse B Objekt.

  3. Die Methode, die wirklich aufgerufen wird, ist nicht notwendig eine der Methoden, die in der Klasse verfügbar sind, die bei der Definition der Objektrefrenz angegeben ist, denn das wäre Klasse A und damit die Methode M(A), sondern es kommt auf den Inhalt der Objektreferenz zum Zeitpunkt des Methodenaufrufs an: die Methode ist eine, die in der Klasse des aktuellen Objekts verfügbar ist, entweder in der Klasse selbst definiert oder von einer Oberklasse geerbt.
    In diesem Falle ist das M(B).

  4. Hier zeigt aref jetzt auf ein Klasse A Objekt und ein „äußerlich“ identischer Invoke wie bei c) ergibt eine andere Ausgabe, weil das aktuelle Objekt ein anderes ist.

Nützliche Hinweise

  • Hieraus leitet sich der Begriff „late binding“ ab, denn die Zuordnung der aktuellen Methode zum Methodenaufruf kann erst zur Laufzeit geschehen, nämlich dann, wenn der aktuelle Inhalt der Objektreferenz, d.h. die Klasse in der die Methode zu suchen ist, bestimmt wird.

  • Dieser Effekt tritt nur dann auf, wenn in einer erbenden Klasse eine Methode der Oberklasse überschrieben wird. Andernfalls ist die gerufene Methode die aus der Oberklasse.

  • Wesentlich dabei ist, dass neben den identischen Methodennamen auch die Schnittstelle der entsprechenden Methoden gleich sein muss (damit ein Unterklassenobjekt auch von Seiten der Schnittstelle wie ein Objekt seiner Oberklasse angesprochen werden kann). Hieraus ergibt sich dann auch die Konformität und eine Form des Polymorphismus.

Beispiel 12-20

für SELF

Klasse A                {M(A),N(A)} Menge der verfügbaren Methoden
    Methode M
          Display ’AAA’
    Methode N
          invoke SELF ’M’                   c)

Klasse B inherits A     {M(B),N(A)} Menge der verfügbaren Methoden
    Methode M override
          Display ’BBB’

Nutzerprogramm

01 aref usage object reference A

    invoke B ’NEW’ returning aref      a)
    invoke aref ’N’                    b)

                Ausgabe -> BBB

Anmerkungen

  1. Das aktuelle Objekt ist ein Klasse B Objekt.

  2. Hier wird die Methode N(A) gerufen, weil in der erbenden Klasse B (von der das aktuelle Objekt stammt) kein eigenes lokales N definiert wurde.

  3. Die Ausführung von N führt zu einem weiteren Methodenaufruf. SELF steht hier für das Objekt, mit dem die Methode aufgerufen wurde, d.h. ein Objekt der Klasse B.Damit ergibt sich wieder die im vorigen Beispiel dargestellte Situation:
    Die für ein Objekt der Klasse B zutreffende Methode ist diejenige, die in Klasse B verfügbar ist, d.h. aus der Menge {M(B), N(A)} (also nicht notwendigerweise eine Methode, die in der Klasse verfügbar ist, in der auch der invoke mit SELF steht: das wäre aus der Menge {M(A), N(A)}).

Nützliche Hinweise

  • Hier stellt sich wieder eine Form des „late binding“ dar.

  • Erbt ’niemand’ von Klasse A, dann ist die mit SELF gerufene Methode genau die, die in Klasse A auch verfügbar ist.

  • Methoden können durch Verwendung von SELF andere Methoden für ihr „aktuelles Objekt“ aufrufen, die zur Übersetzungszeit eventuell noch nicht existieren. Diese Möglichkeit ist hilfreich, da zum Übersetzungszeitpunkt nicht immer absehbar ist „wer“ die entsprechende Klasse in Zukunft erben und ggf. Methoden davon durch eigene ersetzen wird.

Beispiel 12-21

für SUPER

Klasse A                 {M(A)} Menge der verfügbaren Methoden
    Methode M
          Display ’AAA’

Klasse B inherits A      {M(B),N(B)} Menge der verfügbaren Methoden
    Methode M override
          Display ’BBB’
    Methode N
          invoke SUPER ’M’                c)

Klasse C inherits B      {M(C),N(B)} Menge der verfügbaren Methoden
    Methode M override
          Display ’CCC’

Nutzerprogramm

01 aref usage object reference A

    invoke C ’NEW’ returning aref      a)
    invoke aref AS C ’N’               b)

                Ausgabe -> AAA

Anmerkungen

  1. Das aktuelle Objekt ist ein C Objekt.

  2. Die Methode ist in der Menge der für C-Objekte verfügbaren Methoden zu suchen, d.h. aus {M(C),N(B)}. Es wird also die in Klasse B definierte Methode gerufen.

  3. Dies führt zu einem internen Methodenaufruf für das gleiche Objekt, für das Methode N(B) gerufen wurde (also weiterhin das Klasse C Objekt). SUPER zeigt nun an, dass jetzt die Methode unter den in der Oberklasse (falls mehrere geerbte Klassen, dann die betreffende mit dem Klassennamen qualifiziert festlegen!) verfügbaren Methoden gesucht wird. Diese Oberklasse ist nicht relativ zum aktuellen Objekt zu sehen, sondern bezieht sich statisch auf die Klasse in der der Methodenaufruf mit SUPER steht, d.h. Klasse A. Methode M bei c) ist also in den für Klasse A verfügbaren Methoden zu suchen, d.h. aus der Menge {M(A)}.

Nützliche Hinweise

  • SUPER bietet die Möglichkeit, die Methodenauswahl zu steuern: statt der für das aktuelle Objekt verfügbaren Methoden, wird die Suche auf die statisch bekannte Vererbungshierarchie beschränkt.

  • Durch das Überschreiben einer Methode und die Verwendung von SUPER schafft man die Möglichkeit, mit einer „neuen“ Methode bei gleichbleibender Schnittstelle zusätzliche Operationen ausführen zu können. Da in jeder Klasse die verfügbaren Methoden eindeutige Namen haben müssen, und die „neue“ Methode die ersetzte unsichtbar werden lässt, braucht man eine Möglichkeit, diese überschriebene Methode der Oberklasse nutzen zu können. Dazu verwendet man das Sprachmittel SUPER.