Programmierkurs Java Teil Objektorientierte Programmierung Unterrichtseinheit 31 Polymorphie
Programmierkurs Java Teil Objektorientierte Programmierung Unterrichtseinheit 31 Polymorphie Dr. Dietrich Boles Programmierkurs Java UE 31 Polymorphie Dietrich Boles Seite 1
Gliederung Ø Definition Ø Beispiel Ø Protokolleinschränkung Ø Typumwandlung Ø Klasse Object Ø Beispiel Stack Ø Zusammenfassung Programmierkurs Java UE 31 Polymorphie Dietrich Boles Seite 2
Definition Polymorphie: Ø Fähigkeit einer Objektvariablen vom Typ T 1, auf Objekte von Klassen eines anderen Typs T 2 verweisen zu können Ø in Java: T 2 muss Unterklasse von T 1 sein Ø Protokoll ist auf das Protokoll von T 1 eingeschränkt Ø Hintergrund: Protokoll von T 1 ist echte Teilmenge von Protokoll von T 2 Ø Relevanz: Compilierzeit Programmierkurs Java UE 31 Polymorphie Dietrich Boles Seite 3
Beispiel Ø Sei B eine direkte oder indirekte Unterklasse von A. A A object 1 = new B(); // Polymorphie C B static void f(A object) {. . . } B b = new B(); f(b); // Polymorphie B object 2 = new A(); // Fehler A object 3 = new C(); // Fehler Programmierkurs Java UE 31 Polymorphie Dietrich Boles Seite 4
Protokolleinschränkung class Person { String name; Person(String name) { this. name = name; } void print() { IO. println(name); } } class Mitarbeiter extends Person { String buero; Mitarbeiter(String name, String buero) { super(name); this. buero = buero; } void change. Buero(String neu. B) { buero = neu. B; } } class Personen. Test { public static void main(String[] args) { Mitarbeiter kai = new Mitarbeiter("Kai Meyer", "E 67"); Person karl = new Mitarbeiter("Karl Schmidt", "E 50"); kai. change. Buero("E 69"); // ok! karl. change. Buero("E 68"); // Fehler (Protokolleinschr. ) } } Programmierkurs Java UE 31 Polymorphie Dietrich Boles Seite 5
Typumwandlung Ø Typumwandlung (Typ-Cast) von Oberklasse auf Unterklasse explizit möglich (allerdings u. U. unsicher!) class A B B C a b 1 b 2 c D d A B C D = = {. . . } extends A {. . . } new B(); a; // (B)a; (C)a; // // = (D)a; // A B D C Syntaxfehler! ok, allerdings beim Zugriff Laufzeitfehler Syntaxfehler Programmierkurs Java UE 31 Polymorphie Dietrich Boles Seite 6
Klasse Object (1) Ø Jede Klasse in Java ist von der Klasse Object abgeleitet: public class Object { public Object clone(); // Werte-Kopie public boolean equals(Object obj); // Wertgleichheit? public String to. String(); // konvertiert in String. . . } Ø Fehlt bei der Klassendefinition das extends, ist automatisch die Klasse Object direkte Oberklasse Ø die angeführten Methoden sollten von jeder neu definierten (ADT-)Klasse reimplementiert (überschrieben) werden! Programmierkurs Java UE 31 Polymorphie Dietrich Boles Seite 7
Klasse Object (2) // ADT-Klasse: public class Int extends Object { private int value; public Int(int v) { this. value = v; } public Int(Int obj) { this. value = obj. value; } public Object clone() { return new Int(this); // auch hier Polymorphie } public boolean equals(Object obj) { return this. value == ((Int)obj). value; } public String to. String() { return String. value. Of(this. value); }. . . Int int. Object = new Int(4711); IO. println("Wert = " + int. Object); // automatischer Aufruf von to. String!!! Programmierkurs Java UE 31 Polymorphie Dietrich Boles Seite 8
Beispiel Stack (1) Ø Vorteil der Polymorphie: Wiederverwendbarkeit class Stack { Object[] store; int current; // zum Speichern von Daten // aktueller Index Stack(int size) { store = new Object[size]; current = -1; } boolean is. Full() { return current == (store. length-1); } boolean is. Empty() { return this. current == -1; } void push(Object value) { this. store[++this. current] = value; } Object pop() { return this. store[this. current--]; } } Programmierkurs Java UE 31 Polymorphie Dietrich Boles Seite 9
Beispiel Stack (2) class Rueckwaerts { public static void main(String[] args) { Stack haufen = new Stack(10); while (!haufen. is. Full()) { String eingabe = IO. read. String("Eingabe: "); haufen. push(eingabe); } while (!haufen. is. Empty()) { Object obj = haufen. pop(); String str = (String)obj; System. out. println(str); } } } Programmierkurs Java UE 31 Polymorphie Dietrich Boles Seite 10
Beispiel Stack (3) class Rueckwaerts. Int { public static void main(String[] args) { Stack haufen = new Stack(10); while (!haufen. is. Full()) { int zahl = IO. read. Int("Eingabe: "); haufen. push(zahl); } while (!haufen. is. Empty()) { int zahl = (Integer)haufen. pop(); System. out. println(zahl); } } } Programmierkurs Java UE 31 Polymorphie Dietrich Boles Seite 11
Beispiel Stack (4) class Akte { int nummer; Akte(int n) { this. nummer = n; } void print() { IO. println(this. nummer); } } class Verwaltung { public static void main(String[] args) { Stack haufen = new Stack(8); while (!haufen. is. Full()){ haufen. push(new Akte(IO. read. Int("Zahl: "))); } while (!haufen. is. Empty()) { Akte akte = (Akte)haufen. pop(); akte. print(); } } } Programmierkurs Java UE 31 Polymorphie Dietrich Boles Seite 12
Zusammenfassung Ø Polymorphie: Fähigkeit einer Objektvariablen vom Typ T 1, auf Objekte von Klassen eines anderen Typs T 2 verweisen zu können, wobei in Java T 2 Unterklasse von T 1 sein muss Ø Vorteil der Polymorphie: flexible Wiederverwendbarkeit von Klassen Programmierkurs Java UE 31 Polymorphie Dietrich Boles Seite 13
- Slides: 13