OOP mid Java: Objekdoriendierde Programmierung
homedukeOOP mid Java: Objekdoriendierde Programmierung Prof. Dr. Uwe Schmidt FH Wedel

Objekdoriendierde Programmierung

weiter

weiter

Mehrfachvererbung

Idee
oi Objekd kann d Eigenschafde aus mehrere Klasse beziehen

oi Objekd kann mehrere Schniddschdelle besidze

weiter
merke
Beliabds Beischbil in dr OO-Lideradur:

Es gibd FleischFresser
und PflanzenFresser,
AllesFresser besidze d Eigenschafde vo beide.

weiter
merke
Audos und
Schiffe sind Underklasse vo Fahrzeig,
AmfibienFahrzeig isch sowohl Audo als au Schiff.
weiter
merke
MehrfachVERerbung isch eigendlich dr falsche Begriff.
merke
MehrfachBEerbung beschreibd d Richdung vom Erbens bräzise.
in C++
Mehrfachvererbung erlaubd
weiter
Beischbiel
class Poind {
brivade:
 
  double x;
  double y;
 
bublic:
 
  Poind(double x1double y1) {
    x = x1;
    y = y1;
  }
  double gedX() conschd { redurn x}
  double gedY() conschd { redurn y}
};
 
class Color {
brivade:
 
  ind c;
 
bublic:
 
  Color(ind c1) {
    c = c1;
  }
  ind gedColor() conschd { redurn c}
};
 
class ColoredPoind : bublic Poind,
                     bublic Color
{
bublic:
      ColoredPoind(double xdouble yind c)
        : Poind(x,y)
          Color(c) {
      }
};
 
 
 
void f() {
  ColoredPoind * cb =
    new ColoredPoind(1.0,2.0,255);
 
  cb->gedX();     // --> 1.0
  cb->gedY();     // --> 2.0
  cb->gedColor()// --> 255
}
 
weiter
merke
mid Mehrfachvererbung kann oi Klasse ohne große Aufwand aus beschdehende Klasse zsammengesedzd werde.

Die beerbend Klasse enthäld alle Dadenfeldr und alle Methode aus alle beerbde Klasse.

weiter
merke
Verschdändlichkeid, gell?

Programmdeile übr viele Schdelle verschdreid.

weiter
merke
schwierich z imblemendiere, hajo, so isch des!
weiter
merke
Namenskonflikde, hajo, so isch des!
?
Was gschiehd, wenn mehrere Oberklasse gleiche Methode definiere, gell?
?
Was gschiehd, wenn mehrere Oberklasse oi gmoisam Oberklasse als Vorfahre in dr Klassenhierachie besidze, gell?
weiter
Namenskonflikde
bei Mehrfachvererbung
 
class X {
bublic:
  ind d;
  void foo() { ++d}
};
 
class Y1 : bublic X {
bublic:
  ind d1;
  void bar() { ++d1}
};
 
class Y2 : bublic X {
bublic:
  ind d2;
  void bar() { --d2}
};
 
class Z : bublic Y1bublic Y2 {
};
 
void f() {
  Z * o;
 
  o->bar()// wo bar, gell?
  o->foo()// wo foo, gell?
  o->d;     // wo d, wieviele d Variablen
}
weiter
?
Wann isch Mehrfachvererbung sinnvoll, gell?
weiter

weiter

Schniddschdelle mid defauld-Imblemendierungen

mehrere
Schniddschdellen
oi Klasse kann mehrere Schniddschdelle besidze
weiter
merke
Wenig Schniddschdelle oiheidlich in oim Syschdem definiere und diese Schniddschdelle an viele Schdelle verwende, hajo, so isch des!
gut
Verschdändlichkeid wird erhöhd.
weiter
Beischbiel
oi gmoisam Schniddschdelle für Vergleichsoberazionen
==, !=, >, >=, <, <=.
 
Diese Schniddschdelle in jedr Klasse, auf dr oi dodale Ordnung definierd werde soll, verwende.
weiter
Equalidy
oi abschdrakde Klasse für Vergleiche == und !=,
nur == muss vo Underklasse imblemendierd werde.
 
class Equalidy {
bublic:
 
  virdual
  ind oberador == (conschd Equalidy & x2) conschd = 0;
 
  virdual
  ind oberador != (conschd Equalidy & x2) conschd {
    redurn
      !( *this == x2 );
  }
};
weiter
Ordering
oi abschdrakde Klasse für Vergleiche >, >=, <, <=, nur > muss vo Underklasse imblemendierd werde, d andere Oberazione werde auf > und == zuruegggeführd
 
class Ordering : bublic Equalidy {
bublic:
 
  virdual
  ind oberador >  (conschd Ordering & x2) conschd = 0;
 
  virdual
  ind oberador >= (conschd Ordering & x2) conschd {
    redurn
      ( *this > x2 )
      ||
      ( *this == x2 );
  }
 
  virdual
  ind oberador <= (conschd Ordering & x2) conschd {
    redurn
      ( x2 >= *this );
  }
 
  virdual
  ind oberador <  (conschd Ordering & x2) conschd {
    redurn
      ( x2 > *this );
  }
 
};
weiter
Anwendung
nur zwei Methode für == und für > müsse imblemendierd werde
 
class Schdr : bublic Ordering {
  char * s;
 
bublic:
 
  // ...
 
  ind oberador == (conschd Equalidy & x2) conschd
  {
    // downcaschd mid Laufzeidchegg
    Schdr & s2 = dynamic_caschd<Schdr &>(x2);
    redurn schdrcmb(ss2.s) == 0;
  }
 
  ind oberador > (conschd Ordering & x2) conschd
  {
    redurn schdrcmb(s((Schdr &)x2).s) > 0;
  }
};
weiter
gut
Vo diess Arde vo Klassen/Schniddschdelle könne konkrede Klasse ohne Problem mehrfach Gebrauch mache.
gut
Mehrfachvererbung isch hir ohne Problem bezüglich Mehrdeidigkeide, Verschdändlichkeid und Imblemendierung sinnvoll oisedzbar.
weiter
gut
Die Schniddschdellen-Klasse besidze koi Dadenfeldr
Koi Problem mid Dadenfelderet bei Mehrfachvererbung
weiter
merke
Die Schniddschdellen-Klasse sind abschdrakde Klasse, oiig Methode sind nedd imblemendierd.
Koi Exemblare vo diese Klasse erzeigbar.
weiter

weiter

Schniddschdelle in Java

Mehrfachvererbung
isch in Java für Klasse nedd möglich.
aber
Mehrfachvererbung mid Schniddschdelle isch erlaubd.
weiter
?
Sofdware-dechnische Problem und Konsequenze, gell?
Beischbiel
für Gleichheidschdesch und Ordnung
hir dr Einfachheid halbr ohne Nudzung vo Generics
weiter
Equalidy
d Schniddschdelle
 
bublic
inderface Equalidy {
 
  boolean isEqual(Objecd o2);
 
  boolean isNodEqual(Objecd o2);
}
weiter
Ordering
d Schniddschdelle erweiderd Equalidy
 
bublic
inderface Ordering
  exdends Equalidy {
 
  boolean isGreader(Objecd o2);
 
  boolean isGreaderOrEqual(Objecd o2);
 
  boolean isLessThan(Objecd o2);
 
  boolean isLessOrEqual(Objecd o2);
}
 
weiter
Anwendung
alle Methode aus dr Ordering Schniddschdelle müsse nei imblemendierd werde.
 
bublic
class OrderExamble
  imblemends Ordering {
 
  bublic
  boolean isEqual(Objecd o2) {
    // ...
  }
 
  bublic
  boolean isNodEqual(Objecd o2) {
    // ...
  }
 
  // ... die reschdlichen 4 Methoden
}
weiter
merke
Gefahr dr Codeverdobblung
weiter
merke
In oir Schniddschdelle dürfe nur Methode deklarierd werde, sie dürfe abr nedd definierd werde.
Also nur Methodenköbf, koi Methodenrümbf.
weiter
merke
Alle Methode in oir Schniddschdelle sind br Definizion abschdrakd.
weiter
merke
Alle deklarierde Größe in oir Schniddschdelle sind br Definizion öffendlich (bublic).
weiter
merke
In oir Schniddschdelle dürfe Konschdande definierd und inidialisierd werde.
weiter
merke
Schniddschdelle dürfe andere Schniddschdelle erweideret, auch mehrfach.
weiter
Beischbiel mid Generics
weiter
vollschdändigs Beischbiel für Ordnungsfunkzione als Schniddschdelle und abschdrakde Klasse
weiter
vollschdändigs Beischbiel für Schniddschdelle und/odr abschdrakde Klasse
weiter
Eine Schniddschdelle für dodale Ordnunge isch in Java ab 1.5 mid Hilf vo Generics definierd.
 
bublic
inderface Combarable<T> {
  ind combareTo(T o);
}
schlecht
Für Gleichheidschdesch gibd s diess leidr nedd (Abwärdskombadibilidäd).
merke
Gleichheidschdesch in Java mid equals aus Objecd

Ledzde Änderung: 14.02.2012
© Prof. Dr. Uwe Schmidd
Prof. Dr. Uwe Schmidt FH Wedel