Programmierkurs Java

13
Programmierkurs Java UE 31 Polymorphie Dietrich Boles Seite 1 Programmierkurs Java Dr. Dietrich Boles Teil Objektorientierte Programmierung Unterrichtseinheit 31 Polymorphie

description

Programmierkurs Java. Teil Objektorientierte Programmierung Unterrichtseinheit 31 Polymorphie. Dr. Dietrich Boles. Gliederung. Definition Beispiel Protokolleinschränkung Typumwandlung Klasse Object Beispiel Stack Zusammenfassung. Definition. Polymorphie : - PowerPoint PPT Presentation

Transcript of Programmierkurs Java

Page 1: Programmierkurs Java

Programmierkurs Java UE 31 Polymorphie Dietrich Boles Seite 1

Programmierkurs Java

Dr. Dietrich Boles

Teil

Objektorientierte Programmierung

Unterrichtseinheit 31

Polymorphie

Page 2: Programmierkurs Java

Programmierkurs Java UE 31 Polymorphie Dietrich Boles Seite 2

Gliederung

Definition

Beispiel

Protokolleinschränkung

Typumwandlung

Klasse Object

Beispiel Stack

Zusammenfassung

Page 3: Programmierkurs Java

Programmierkurs Java UE 31 Polymorphie Dietrich Boles Seite 3

Definition

Polymorphie:

Fähigkeit einer Objektvariablen vom Typ T1, auf Objekte von

Klassen eines anderen Typs T2 verweisen zu können

in Java: T2 muss Unterklasse von T1 sein

Protokoll ist auf das Protokoll von T1 eingeschränkt

Hintergrund: Protokoll von T1 ist echte Teilmenge von Protokoll

von T2

Relevanz: Compilierzeit

Page 4: Programmierkurs Java

Programmierkurs Java UE 31 Polymorphie Dietrich Boles Seite 4

Beispiel

Sei B eine direkte oder indirekte Unterklasse von A .

A object1 = new B(); // Polymorphie

static void f(A object) { ... }

B b = new B();

f(b); // Polymorphie

B object2 = new A(); // Fehler

A object3 = new C(); // Fehler

A

B

C

Page 5: Programmierkurs Java

Programmierkurs Java UE 31 Polymorphie Dietrich Boles Seite 5

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 changeBuero(String neuB) { buero = neuB; }}class PersonenTest { public static void main(String[] args) { Mitarbeiter kai = new Mitarbeiter("Kai Meyer", "E 67"); Person karl = new Mitarbeiter("Karl Schmidt", "E 50");

kai.changeBuero("E 69"); // ok! karl.changeBuero("E 68"); // Fehler (Protokolleinschr.)} }

Page 6: Programmierkurs Java

Programmierkurs Java UE 31 Polymorphie Dietrich Boles Seite 6

Typumwandlung

Typumwandlung (Typ-Cast) von Oberklasse auf Unterklasse

explizit möglich (allerdings u.U. unsicher!)

class A { ... }class B extends A { ... }class C extends A { ... }class D { ... }

A a = new B();B b1 = a; // Syntaxfehler!B b2 = (B)a;C c = (C)a; // ok, allerdings beim Zugriff // LaufzeitfehlerD d = (D)a; // Syntaxfehler

A

CB

D

Page 7: Programmierkurs Java

Programmierkurs Java UE 31 Polymorphie Dietrich Boles Seite 7

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 toString(); // 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!

Page 8: Programmierkurs Java

Programmierkurs Java UE 31 Polymorphie Dietrich Boles Seite 8

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 toString() { return String.valueOf(this.value); } ...}...Int intObject = new Int(4711);IO.println("Wert = " + intObject); // automatischer Aufruf von toString!!!

Page 9: Programmierkurs Java

Programmierkurs Java UE 31 Polymorphie Dietrich Boles Seite 9

Beispiel Stack (1)

Vorteil der Polymorphie: Wiederverwendbarkeit

class Stack { Object[] store; // zum Speichern von Daten int current; // aktueller Index

Stack(int size) { store = new Object[size]; current = -1; }

boolean isFull() { return current == (store.length-1); } boolean isEmpty() { return this.current == -1; }

void push(Object value) { this.store[++this.current] = value; } Object pop() { return this.store[this.current--]; } }

Page 10: Programmierkurs Java

Programmierkurs Java UE 31 Polymorphie Dietrich Boles Seite 10

Beispiel Stack (2)

class Rueckwaerts {

public static void main(String[] args) {

Stack haufen = new Stack(10);

while (!haufen.isFull()) {

String eingabe = IO.readString("Eingabe:");

haufen.push(eingabe);

}

while (!haufen.isEmpty()) {

Object obj = haufen.pop();

String str = (String)obj;

System.out.println(str);

}

} }

Page 11: Programmierkurs Java

Programmierkurs Java UE 31 Polymorphie Dietrich Boles Seite 11

Beispiel Stack (3)

class RueckwaertsInt {

public static void main(String[] args) {

Stack haufen = new Stack(10);

while (!haufen.isFull()) {

int zahl = IO.readInt("Eingabe:");

haufen.push(zahl);

}

while (!haufen.isEmpty()) {

int zahl = (Integer)haufen.pop();

System.out.println(zahl);

}

}

}

Page 12: Programmierkurs Java

Programmierkurs Java UE 31 Polymorphie Dietrich Boles Seite 12

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.isFull()){ haufen.push(new Akte(IO.readInt("Zahl: "))); } while (!haufen.isEmpty()) { Akte akte = (Akte)haufen.pop(); akte.print(); } }}

Page 13: Programmierkurs Java

Programmierkurs Java UE 31 Polymorphie Dietrich Boles Seite 13

Zusammenfassung

Polymorphie: Fähigkeit einer Objektvariablen vom Typ T1, auf Objekte

von Klassen eines anderen Typs T2 verweisen zu können, wobei in

Java T2 Unterklasse von T1 sein muss

Vorteil der Polymorphie: flexible Wiederverwendbarkeit von Klassen