Prof. Dr. Oliver Haase Karl Martin Kern Achim Bitzer. Programmiertechnik Schnittstellen, Vererbung & Polymorphismus für Fortgeschrittene

Ähnliche Dokumente
Programmiertechnik Vererbung & Polymorphismus für Fortgeschrittene

Einstieg in die Informatik mit Java

Einstieg in die Informatik mit Java

Kapitel 9. Programmierkurs. Attribute von Klassen, Methoden und Variablen. 9.1 Attribute von Klassen, Methoden und Variablen

Vererbung, Polymorphie

Einstieg in die Informatik mit Java

Javakurs FSS Lehrstuhl Stuckenschmidt. Tag 3 - Objektorientierung

Programmiertechnik Klassenvariablen & Instantiierung

Prof. Dr. Oliver Haase Karl Martin Kern Achim Bitzer. Programmiertechnik Objektorientierung

Vererbung. Gerd Bohlender. Institut für Angewandte und Numerische Mathematik. Vorlesung: Einstieg in die Informatik mit Java 23.5.

Java Einführung Vererbung und Polymorphie. Kapitel 13

Vererbung. Gerd Bohlender. Institut für Angewandte und Numerische Mathematik. Vorlesung: Einstieg in die Informatik mit Java 14.1.

Algorithmen und Datenstrukturen 07

Die Klasse java.lang.object. Thorsten Treffer

Neben der Verwendung von Klassen ist Vererbung ein wichtiges Merkmal objektorientierter

Das Interface-Konzept am Beispiel der Sprache Java

Kapitel 13. Abstrakte Methoden und Interfaces. Fachgebiet Knowledge Engineering Prof. Dr. Johannes Fürnkranz

12 Abstrakte Klassen, finale Klassen und Interfaces

Tafelübung 07 Algorithmen und Datenstrukturen

Informatik II Übung 6

Programmiertechnik Objektorientierung

Institut für Programmierung und Reaktive Systeme. Java 7. Markus Reschke

1 Abstrakte Klassen, finale Klassen und Interfaces

Überschreiben von Methoden

Algorithmen und Datenstrukturen

Erste Java-Programme (Java Wiederholung & Vererbung)

Vererbung. Martin Wirsing. Ziele. Vererbung

Prof. Dr. Oliver Haase Karl Martin Kern Achim Bitzer. Programmiertechnik Übungen zu Vererbung & Polymorphismus

Programmierung Nachklausurtutorium

Einstieg in die Informatik mit Java

7. Schnittstellen Grundlagen zu Schnittstellen. 7. Schnittstellen

Weitere Beispiele. Beispiel CD-Spieler: Exemplare eines abstrakten Konzepts. 7. Schnittstellen. Schnittstelle: Syntax

Polymorphie. 15. Java Objektorientierung II

Programmieren 2 Java Überblick

Polymorphie. 15. Java Objektorientierung II

4. Vererbung Die Klasse Object. Die Klasse Object

6. Globalübung (zu Übungsblatt 8)

Vorkurs Informatik WiSe 15/16

Grundzüge der Programmierung. Wiederverwendung VERERBUNG

FH D. Objektorientierte Programmierung in Java FH D FH D. Prof. Dr. Ing. André Stuhlsatz. Wiederholung: Gerüstbeispiel. Vererbungshierarchie: Typ 0

14 Abstrakte Klassen, finale Klassen, Interfaces

Einführung in C# Teil 3. Matthias Nübling

14 Abstrakte Klassen, finale Klassen, Interfaces. Auswertung von Ausdrücken. Beispiel. Abstrakte Methoden und Klassen

Programmieren in Java

14. Java Objektorientierung. Klassen, Vererbung, Kapselung

Innere Klassen. Gerd Bohlender. Institut für Angewandte und Numerische Mathematik. Vorlesung: Einstieg in die Informatik mit Java

Vererbung P rogram m ieren 2 F örster/r iedham m er K apitel 11: V ererbung 1

14 Abstrakte Klassen, finale Klassen, Interfaces

14. Java Objektorientierung

Java für Bauingenieure

Einstieg in die Informatik mit Java

Die abstrakte Klasse Expression:

Vererbung P rogram m ieren 2 F örster/r iedham m er K apitel 11: V ererbung 1

Vorausgesetzte Grundkenntnisse. Inhalt. Klassenhierarchie und Vererbung. Vererbung. Klassenhierarchie und Vererbung. Einführung in C# Teil 3

Einführung in die Programmierung I. 11. Vererbung. Stefan Zimmer

Beispiel: Zwischen der Oberklasse und der abgeleiteten Klasse besteht eine ist ein Beziehung. Eine abgeleitete Klasse stellt eine Spezialisierung der

Programmieren in Java

Javakurs für Anfänger

Info B VL 8: Abstrakte Klassen & Interfaces

2.13 Vererbung. Rainer Feldmann Universität Paderborn Technische Informatik für Ingenieure (TIFI) WS 09/ Article

4. Vererbung. Idee der Vererbung. Wir wollen ein Verwaltungsprogramm für CDs und Videos entwickeln. Wir stellen uns dazu folgende Klassen vor:

Inhaltsverzeichnis. Grundlagen und Einführung (1. Band) 1

14. Java Objektorientierung

Teil 2: Weitere Aspekte der Objektorientierung

EINFÜHRUNG IN DIE PROGRAMMIERUNG

Programmieren I. Kapitel 8. Vererbung

Klassen und Konstruktoren in Java

Javakurs für Anfänger

Einführung in die Programmierung

Anwendungsentwicklung mit Java. Grundlagen der OOP, Vererbung, Schnittstellen, Polymorphie

Vererbung, Polymorphismus

Abstrakte Basisklassen

Wiederholung. Klassenhierarchie:

Probeklausur: Programmierung WS04/05

Objektorientierte Programmierung. Kapitel 14: Interfaces

Polymorphie/Späte Bindung Abstrakte Klassen Interfaces. Polymorphie/Späte Bindung Abstrakte Klassen Interfaces

II.4.1 Unterklassen und Vererbung - 1 -

Programmiertechnik Noch mehr Übung macht den größeren Meister!

Klassen und ihre Beziehungen II: Einfache Vererbung und Abhängigkeit

Vererbung und Polymorphie

Programmierkurs Java

Klassen und ihre Beziehungen III: Mehrfache Vererbung, Rollen, Schnittstellen und Pakete

C++ - Objektorientierte Programmierung Polymorphie

Repetitorium Informatik (Java)

3 Objektorientierte Konzepte in Java

Tag 8 Repetitorium Informatik (Java)

1 Einleitung Generizität Syntax... 2

Java Einführung Klassendefinitionen

Ersetzbarkeit und Verhalten

Programmiertechnik Objektorientierung, Teil 2

Client-Server-Beziehungen

Programmieren in Java -Eingangstest-

EINFÜHRUNG IN DIE PROGRAMMIERUNG

JAVA 05: Objektorientierte Konzepte

Objektorientierte Programmierung. Kapitel 22: Aufzählungstypen (Enumeration Types)

Was du ererbt von Deinen Vätern hast, erwirb es, um es zu besitzen. J. W. v. Goethe.

Kapitel 4: Klassen und Unterklassen

Transkript:

Prof. Dr. Oliver Haase Karl Martin Kern Achim Bitzer Programmiertechnik Schnittstellen, Vererbung & Polymorphismus für Fortgeschrittene

Motivation Aufgabe: Finanzbuchhaltungssystem für internationale Hotelkette Problem: Hotels in verschiedenen Ländern rechnen mit verschiedenen Währungen, die ineinander umgerechnet werden müssen. Annahme: Abrechnungen erfolgen in US-Dollar. Problem: Umtauschkurs ändert sich jeden Tag! Beispiel: Hotel in Tokio hat eine Safe-Einlage im Wert von $25000. Über Nacht steigt der Kurs des Yen um 10% neuer Wert der Safe-Einlage: $27500. Der Wert der Safe-Einlage darf nicht in US-$ gespeichert werden, sondern muss dynamisch berechnet werden. 2/35

Schnittstellen Idee: Generalisiere von den konkreten Währungen, und führe eine Schnittstelle Waehrung ein: public interface Waehrung { // // gibt den Wert in in US-$ aus public double dollarbetrag(); Schnittstellen sind Sammlungen von Instanzmethoden. Dabei enthalten Schnittstellen nur Methodendeklarationen ohne Implementierung. 3/35

Schnittstellen Eine Klasse kann Schnittstellen implementieren. Dazu muss sie alle in der Schnittstelle deklarierten Methoden definieren. Eine Schnittstelle selbst kann nicht instantiiert werden! Wie eine äußere Klasse wird auch eine Schnittstelle in einer gleichnamigen.java-datei gespeichert Waehrung.java. 4/35

Schnittstellen in UML interface Wertgegenstand dollarbetrag: double Merke: Die Namen von Schnittstellen und deren Methoden werden kursiv geschrieben. Vor den Namen der Schnittstelle wird das Schlüsselwort interface gestellt 5/35

Schnittstellen - Zweck Wozu sind Schnittstellen gut, wenn sie nicht instantiiert werden können? Implementierende Klassen enthalten garantiert alle in der Schnittstelle deklarierten Instanzmethoden im Beispiel: alle Klassen, die Waehrung implementieren, müssen die Instanzmethode dollarbetrag implementieren. Die Schnittstelle Waehrung garantiert, dass alle Subklassen die Methode dollarbetrag besitzen (Schnittstellenvererbung) 6/35

Klasse USDollar einfachste Währung ist US-Dollar, da keine Umrechnung nötig ist: public class USDollar implements Waehrung { // // Instanzvariable: Wert Wert in in US-$ US-$ private double wert; public USDollar(double wert) { this.wert = wert; public double dollarbetrag() { return wert; 7/35

Klasse Yen public public class class Yen Yen implements Waehrung Waehrung { private private static static double double kurs; kurs; // // Instanzvariable: Wert Wert in in Yen Yen private private double double wert; wert; public public Yen(double wert) wert) { this.wert = wert; wert; public public double double dollarbetrag() { return return wert wert * kurs; kurs; public public static static void void setkurs(double kurs) kurs) { Yen.kurs Yen.kurs = kurs; kurs; Klassenvariable, da Kurs für alle Yen-Objekte gilt und nur einmal gespeichert werden muss Wert wird in Yen gespeichert Wert in US-$ wird zurückgegeben. Kurs kann klassenweit aktualisiert werden 8/35

Verwendung der Klasse Yen Tokioter Hotel hat eine Safe-Einlage von 2 000 000: Yen safeinhalt = new Yen(2000000); Tauschkurs ändert sich auf 130 pro US-$: Yen.setKurs(1.0 / 130); Aktuellen Wert des Safe-Inhalts in US-$ ausgeben: System.out.println("Wert der Einlage in in US-$: " + safeinhalt.dollarbetrag()); Konsole Wert der Einlage in US-$: 15384.62 9/35

Waehrung Polymorphismus Aufgabe: Berechnung der Steuer von 8% (veranlagt in den USA) für das gesamte Barvermögen der Hotelkette. Idee: Erstelle eine neue Klasse Steuer und implementiere diese Funktionalität als Klassenmethode: public class Steuer { public static double berechnesteuer(waehrung[] geld){ double summe = 0.0; 0.0; for for ( int int i = 0; 0; i < geld.length; i++ i++ ) { summe += += geld[i].dollarbetrag(); return summe * 0.08; Wie kann es ein Feld von Komponenten vom Typ Waehrung geben, wenn Waehrung nicht instanziiert werden kann? 10/35

Waehrung Polymorphismus Antwort: Jede Klasse, die Waehrung implementiert, d.h. USDollar und Yen, kann an die Stelle der Schnittstelle Waehrung treten Polymorphismus! Erklärung: Objekte vom Typ USDollar und Yen besitzen mindestens alle Eigenschaften der Schnittstelle Waehrung. Das gilt auch bei Klassenvererbung, nicht nur bei Schnittstellen 11/35

Waehrung Polymorphismus Allgemein: Ein speziellerer Typ kann all das, was ein allgemeinerer Typ kann. Der allgemeinere Typ kann eine Klasse oder eine Schnittstelle sein Der speziellere Typ wird implizit aufwärtskonvertiert in den allgemeineren Typ. 12/35

Waehrung Polymorphismus Beispiel: Waehrung[] geld = new Waehrung[3]; geld[0] = new USDollar(2500); geld[1] = new Yen(2000000); geld[2] = new USDollar(20); double steuer = Steuer.berechneSteuer(geld); Beachte: Ein Objekt vom Typ USDollar kann an eine Variable vom Typ Waehrung zugewiesen werden US-$ ist eine (is-a) Währung 13/35

Objekttyp-Konversion Allgemeiner: Die Klasse SpezielleKlasse implementiert die Schnittstelle EineSchnittstelle. Dann sind die folgenden Codezeilen zulässig. EineSchnittstelle a; a; SpezielleKlasse s; s; // // s =...; a = s; s; und auch: EineSchnittstelle a = new SpezielleKlasse(); 14/35

Objekttyp-Konversion Beachte: Java führt eine implizite Aufwärtskonversion für Objekttypen durch, ähnlich der für skalare Typen. Diese kann auch explizit angegeben werden: EineSchnittstelle a = (EineSchnittstelle) new SpezielleKlasse(); 15/35

Objekttyp-Konversion Auch eine explizite Abwärtstypwandlung ist möglich Vorsicht: kann zu Laufzeitfehler führen! EineSchnittstelle a = new SpezielleKlasse(); SpezielleKlasse s = (SpezielleKlasse) a; a; OK falsch! EineSchnittstelle a = new SpezielleKlasse_2(); SpezielleKlasse s = (SpezielleKlasse) a; a; (die Klasse SpezielleKlasse_2 implementiert EineSchnittstelle) 16/35

Objekttyp-Konversion Der Typ eines Objektes kann zur Laufzeit mit dem instanceof-operator geprüft werden: Syntaxregel <objectname> instanceof <TypName>; TypName kann der Name einer Klasse oder einer Schnittstelle sein Die Operation liefert true, wenn das Objekt eine Instanz der angegeben Klasse ist einer Klasse ist, die die angegebene Schnittstelle implementiert einer (direkten oder indirekten) Subklasse ist Ansonsten liefert die Operation false 17/35

Objekttyp-Konversion Beispiel (Sichern einer Abwärtstypwandlung): EineSchnittstelle a = new new SpezielleKlasse(); if if (a (a instanceof SpezielleKlasse) { SpezielleKlasse s = (SpezielleKlasse) a; a; // // verwende verwende s else else { System.out.println( "something went went terribly terribly wrong!"); 18/35

Waehrung - Polymorphismus Frage: Was passiert beim Aufruf von dollarbetrag() in der Methode berechnesteuer()? public static double berechnesteuer(waehrung[] geld) { double summe = 0.0; 0.0; for for ( int int i = 0; 0; i < geld.length; i++ i++ ) { summe += += geld[i].dollarbetrag(); return summe * 0.08; 19/35

Waehrung - Polymorphismus Frage: Was passiert beim Aufruf von dollarbetrag() in der Methode berechnesteuer()? public static double berechnesteuer(waehrung[] geld) { double summe = 0.0; 0.0; for for ( int int i = 0; 0; i < geld.length; i++ i++ ) { summe += += geld[i].dollarbetrag(); return summe * 0.08; Antwort: Für Objekte vom Typ USDollar wird die Methode verwendet, die in der Klasse USDollar definiert wurde, und für Objekte vom Typ Yen die Methode, die in der Klasse Yen definiert wurde späte Bindung (late binding). 20/35

Abstrakte Klassen Aufgabe: Hotelkette besitzt neben Barvermögen (Objekte vom Typ Waehrung) auch andere Arten von Vermögen: Grundstücke Aktien Firmenbeteiligungen Wir wollen sicher stellen, dass jeder Wertgegenstand seinen monetären Gegenwert nennen kann. Lösungsmöglichkeit: Definition einer neuen Schnittstelle WertGegenstand mit einer Instanzmethode wert(). Klassen, die WertGegenstand implementieren, müssen eine Instanzmethode Methode wert() implementieren 21/35

Abstrakte Klassen alternative Lösung: Abstrakte Klasse: public abstract class Wertgegenstand { public abstract Waehrung wert(); Eine abstrakte Klasse kann neben konkreten Methoden mit Methodenrumpf auch abstrakte Methoden enthalten. Eine abstrakte Methode ist eine Methodendeklaration ohne Implementierung wie bei einer Schnittstelle. Eine Subklasse muss ihre eigene Implementierung bereitstellen. Eine abstrakte Klasse kann nicht instantiiert werden! 22/35

Abstrakte Klassen Beispiel: public class Goldbarren extends Wertgegenstand { public static double grammpreisindollar = 60; 60; private double gewicht; public Goldbarren(double gewicht) { this.gewicht = gewicht; public Waehrung wert() { return new new USDollar(gewicht * grammpreisindollar); Beachte: Goldbarren muss die Methode wert() definieren! 23/35

Abstrakte Klassen in UML Wertgegenstand wert: Waehrung Goldbarren Merke: Die Namen abstrakter Klassen und Methoden werden kursiv geschrieben. 24/35

Abstrakte Klassen Anwendung: public public static static Waehrung Waehrung gesamtwert( Wertgegenstand[] objekte) objekte) { double double summe summe = 0.0; 0.0; for for ( int int i = 0; 0; i < objekte.length; i++ i++ ) { summe summe += += objekte[i].wert().dollarbetrag(); return return new new USDollar(summe); Die Abstrakte Klasse Wertgegenstand wird verwendet wie eine Klasse, siehe beispielsweise "Wertgegenstand[]". Das Feld objekte enthält Objekte, die von der abstrakten Klasse Wertgegenstand abgeleitet sind. Damit ist sichergestellt, dass diese alle die Methode wert() definieren. 25/35

Schnittstellen vs. Klassen Eine Klasse kann nur eine Superklasse haben Einfachvererbung, keine Mehrfachvererbung. Eine Klasse kann beliebig viele Schnittstellen implementieren. Eine Schnittstelle kann keine Methodendefinitionen enthalten. Eine abstrakte Klasse kann abstrakte sowie konkrete Methoden enthalten. Eine Schnittstelle kann außer Konstanten keine Variablen enthalten. Eine Schnittstelle kann keine Klassenmethoden deklarieren. 26/35

super Analog zu this gibt es auch ein Schlüsselwort super. Zur Erinnerung: this bezeichnet die aktuelle Instanz, für die gerade eine Instanzmethode ausgeführt wird. Mit this.<komponentenname> kann auf eine Instanzvariable oder eine andere Instanzmethode zugegriffen werden. Als Methode this(<parameterliste>) bezeichnet this einen Konstruktor. Damit kann ein (spezieller) Konstruktor auf einen (allgemeinen) Konstruktor zurückgeführt werden. Sehr ähnliches gilt für die super-referenz und den super-konstruktor! 27/35

super-konstruktor Ein Konstruktor kann und zwar nur in der 1. Zeile einen Aufruf des Konstruktors der Superklasse enthalten. Wenn das nicht der Fall ist, fügt Java automatisch den parameterlosen Konstruktor der Superklasse ein. public class NonsensDollar extends USDollar { public NonsensDollar(double wert) { super(wert); public double dollarbetrag() { überschreibt return Math.random(); gleich-namige Methode der Klasse USDollar. 28/35

super-referenz Die super-referenz bezeichnet das aktuelle Objekt, jedoch als Instanz der Superklasse betrachtet! Damit ermöglicht super Zugriff auf Komponenten (Variablen und Methoden), die anderenfalls überdeckt und damit nicht sichtbar wären: public class NonsensDollar extends USDollar { public double jetztmalimernst() { return super.dollarbetrag(); 29/35

Die Klasse Object Jede Klasse, die keine explizite Superklasse hat, ist automatisch Subklasse von java.lang.object. Damit ist letztendlich jede Klasse direkt oder indirekt Subklasse von Object, und hat damit auch alle Eigenschaften der Klasse Object. Object definiert eine Reihe von Methoden. Die für uns interessanteste ist public String tostring(). Außerdem wird die gemeinsame Superklasse Object als Elementtyp von Kollektionen verwendet. 30/35

Die Methode tostring Die Methode tostring() wird verwendet, um Objekte in eine menschlich lesbare, textuelle Repräsentation zu bringen. Die Methode System.out.println() wendet auf alle Objektparameter (außer Strings) vor dem Ausdrucken die Methode tostring() an. Der Code Yen betrag = new Yen(200000); System.out.println("Betrag: " + betrag); ist gleichwertig zu: Yen betrag = new Yen(200000); System.out.println( "Betrag: " + betrag.tostring()); 31/35

Die Methode tostring Die Standardimplementierung der Klasse Object führt zu einem Ausdruck der Form: Betrag: Yen@18d107f Konsole Deshalb macht es Sinn, tostring() geeignet zu überschreiben: public public class class Yen Yen implements Waehrung { private private double double wert; wert; public public String String tostring() { return return wert wert + " Yen"; Yen"; Betrag: 200000.0 Yen Konsole 32/35

Object für Kollektionen Die Superklasse Object kann verwendet werden, um Objekte beliebigen Typs in Kollektionen (Mengen, Multimengen, Listen) zu verwalten: public class CircularArray { private final static int int SIZE SIZE = 100; 100; private int int index; private Object[] elements; public CircularArray() { elements = new new Object[SIZE]; index = 0; 0; 33/35

Object für Kollektionen public void void add(object element) { elements[index] = element; index = (index + 1) 1) % SIZE SIZE ; public Object pop() { index = ( index > 0 )? index-1 : SIZE SIZE -1; -1; return elements[index]; 34/35

Object für Kollektionen Verwendung für Student-Objekte CircularArray array = new CircularArray(); Student studi1 = new Student(); studi1.setname("karla Karlson"); studi1.setnummer(12345); Student is-a Object array.add(studi1); Student studi2 = (Student) array.pop(); Typwandlung nötig, da pop-methode Ergebnis vom Typ Object liefert! 35/35