Praktische Informatik 1


Vererbung, Polymorphismus, dynamisches Binden



Yüklə 3,49 Mb.
səhifə20/25
tarix08.08.2018
ölçüsü3,49 Mb.
#61957
1   ...   17   18   19   20   21   22   23   24   25

7.3 Vererbung, Polymorphismus, dynamisches Binden


Beim Vergleich von Ingenieurswesen und Software-Engineering fällt auf, dass Ingenieure ihren Gegenstandsbereich hierarchisch strukturieren. Ein Beispiel aus dem Maschinenbau ist die hierarchische Strukturierung eines KFZ gemäß dem Aufbau:
Fahrzeug – Getriebe – Zahnrad.
Innerhalb der Betrachtungsebene „Zahnrad“ gibt es eine Typenreihen-Strukturierung gemäß der Weltsicht („Ontologie“): Es gibt runde und ovale Zahnräder, Zahnräder bei denen die Zähne innen oder außen sind, usw. Auf der Betrachtungsebene „Fahrzeug“ gibt es die Spezialisierungen (z.B.) Volkswagen, Nutzfahrzeuge, Caddy, Life, TDI 1.9 DPF.

Die Einteilung entspricht dem, was man in der Informatik „Vererbungsstruktur“ nennt; es gibt verschiedene Zahnrad-Bautypen, die sich voneinander im Detail unterscheiden; es gibt aber auch gewisse Gemeinsamkeiten, die uns veranlassen, von einem „Zahnrad“ zu sprechen. Genauso: es gibt verschiedene KFZ-Marken, aber alle haben 4 Räder und einen Hubraum.

Wenn ein Ingenieur ein Getriebe konstruiert, überlegt er sich eine Dekomposition in Komponenten (bzw. einen Bauplan zum Zusammensetzen aus Einzelteilen) und schlägt in Katalogen mit Zahnkranz-Bautypen nach oder modifiziert bestehende Bautypen geeignet.

In der objektorientierten Programmierung besteht Softwaredesign aus der Dekomposition des Problems in einzelne Klassen (bzw. der Strukturierung in eine Klassenhierarchie) und dem Zusammenfügen bzw. der Modifikation vorhandener Bibliotheksklassen. Genau wie ein Fahrzeug aus vielen Einzelteilen besteht, ist objektorientierte Software aus vielen Klassen zusammengesetzt.

Technisch bedeutet dies, dass Klassendefinitionen auf verschiedene Weise hierarchisch strukturiert sein können:


  • Klassen dürfen lokale Klassen als Deklaration enthalten

  • Klassen können zu Paketen zusammengefasst werden

  • Zwischen Klassen kann eine Erbschaftsbeziehung (Super/Subklassenhierarchie) bestehen

  • Zwischen abstrakten und konkreten Klassen kann eine Implementierungsrelation bestehen

Vererbung ist also das fundamentale Konzept der oo- (objektorientierten) Programmierung.
Als Beispiel betrachten wir eine Hierarchie von Fahrzeugtypen:

© http://www.javabuch.de/
Diese Hierarchie könnte objektorientiert etwa wie folgt nachempfunden werden:
public class Fahrzeug {

private int tachostand;

public Fahrzeug() {

tachostand = 0;

}

public int gibTachostand() {

return tachostand;

}

public void fahre(int strecke) {

tachostand += strecke;

}

}


Eine Erweiterung dieser Klasse wäre dann etwa:
class LKW extends Fahrzeug {...}
Durch diese Definition sind alle Datenfelder und Methoden von Fahrzeug auch für LKW verfügbar (Ausnahme: private Datenfelder und Methoden). Wir sagen, dass die Klasse LKW die Attribute der Klasse Fahrzeug erbt. LKW kann darüber hinaus zusätzliche Variablen oder Methoden enthalten oder Methoden abändern


    • z.B. nutzlast oder transportiere

    • z.B. fahre mit zusätzlichem Argument ladung

Der Zugriff auf die Methoden erfolgt mit Member-Selektor (Punkt), z.B. lkw1.ladung


Polymorphismus
Auf oberster Ebene gilt: Jede Klasse ist von der allgemeinsten Klasse Object abgeleitet und erbt von dieser gewisse Eigenschaften


    • Object clone()

    • boolean equals(Object)

    • String toString()

    • ...

In den meisten Fällen muss jedoch die generische („ererbte“) Definition der Methoden abgeändert werden. In abgeleiteten Klassen dürfen alle ererbten Methoden neu definiert werden (Ausnahmen: private, final). Dies realisiert den Umstand, dass im Speziellen zusätzliche Maßnahmen gegenüber dem Allgemeinen durchgeführt werden.

Beispiel: ein LKW kann nicht rückwärts fahren, daher prüft fahre zunächst ob das Argument positiv ist:
public void fahre(int strecke){
if (strecke > 0) super.fahre(strecke);
}
Die speziellere Methode überlagert die allgemeinere aus der übergeordneten Klasse. Unter Polymorphie (griechisch: „Vielgestaltigkeit“) versteht man die Tatsache, dass unterschiedliche Methoden in verschiedenen Klassen oder auch Methoden mit verschiedenen Parametern innerhalb einer Klasse gleich bezeichnet sein dürfen. Beispiele:


  • + für Int-, Float-Addition, String-Konkatenation

  • neue Methode fahre in Klasse LKW mit zusätzlichem Argument last prüft zunächst ob die angegebene Nutzlast überschritten wurde:

    public void fahre(int strecke, int last) {


    if (last > nutzlast)
    System.out.println("überladen!");
    else fahre(strecke); }

In jedem Fall muss an Hand der Signatur oder des Objekttyps entscheidbar sein, welche Methode gemeint ist.


public class LKW extends Fahrzeug {

private int nutzlast;

public LKW(int nutzlast){

this.nutzlast = nutzlast;

}

public void fahre(int strecke){



if (strecke > 0) super.fahre(strecke);

}

public void fahre(int strecke, int last) {



if (last > nutzlast)

System.out.println("überladen!");



else fahre(strecke);

}

public void transportiere (int last, int start, int ziel)

{ /* belade(last); fahre(ziel - start, last); */ }

}
Dynamisches Binden

Es ist nicht immer statisch entscheidbar, welche Methode gerade gemeint ist:
Fahrzeug kfz = new LKW(...);
kfz.fahre (... ladung); ...
if (...) kfz = new PKW();
kfz.fahre(... personen);
Das bedeutet, dass erst zur Laufzeit entschieden werden kann, welche Methode jetzt eigentlich gemeint ist. Diesen Effekt nennt man „dynamisches Binden“. Zur Realisierung erzeugt der Compiler zusätzlichen Code zur Prüfung (Ausnahmen: private, static, final).
public class Fuhrpark {

private static Fahrzeug f;
public static void sampleMethod() {

f = new LKW(20000); // ein 20-Tonner

f.fahre(-100); // welches fahre?

//f.fahre(100, 10000); // nicht erlaubt



f = new LKW(4); // ein 4-Sitzer

((LKW)f).fahre(123,5);

}

}
Bindungsregeln und Objektinitialisierung




  • Beim Erzeugen eines Objektes mittels new werden zunächst die Konstruktoren der vererbenden Klassen (Eltern, Großeltern etc.) aufgerufen.

  • Die eigenen Merkmale können mit dem Deskriptor this, die der jeweiligen Elternklasse mit super aufgerufen werden.

  • Eventuelle Typumwandlung (Casting) durch vorgestelltes (Typ)


Yüklə 3,49 Mb.

Dostları ilə paylaş:
1   ...   17   18   19   20   21   22   23   24   25




Verilənlər bazası müəlliflik hüququ ilə müdafiə olunur ©genderi.org 2024
rəhbərliyinə müraciət

    Ana səhifə