2.4.3 Polymorphie (Wiederholung von Alp2)



Ähnliche Dokumente
Verhindert, dass eine Methode überschrieben wird. public final int holekontostand() {...} public final class Girokonto extends Konto {...

Prinzipien Objektorientierter Programmierung

Client-Server-Beziehungen

Kapitel 6. Vererbung

Typumwandlungen bei Referenztypen

Objektorientierte Programmierung. Kapitel 12: Interfaces

Kapitel 6. Vererbung

Kapitel 6. Vererbung

Programmieren in Java

Java: Vererbung. Teil 3: super()

Objektorientierte Programmierung

3 Objektorientierte Konzepte in Java

Client-Server Beziehungen

Prof. Dr. Uwe Schmidt. 21. August Aufgaben zur Klausur Objektorientierte Programmierung im SS 2007 (IA 252)

Vererbung & Schnittstellen in C#

Spezifikation, Klassen, Schnittstellen in Java. 2.4 Datenabstraktion, Objektorientierung, Java

Java Kurs für Anfänger Einheit 5 Methoden

7. Objektorientierte Softwareentwicklung/3. Informatik II für Verkehrsingenieure

5.6 Vererbung. Vererbung

1. Grundlegende Eigenscha5en 2. Redefini+on 3. Polymophie 4. Mehrfachvererbung

SEP 114. Design by Contract

Tagesprogramm

Wintersemester Maschinenbau und Kunststofftechnik. Informatik. Tobias Wolf Seite 1 von 22

Objektorientierte Programmierung

OO Softwareentwicklung

Javadoc. Programmiermethodik. Eva Zangerle Universität Innsbruck

II. Grundlagen der Programmierung. 9. Datenstrukturen. Daten zusammenfassen. In Java (Forts.): In Java:

Vererbung. Vererbung von Methoden und Instanzvariablen. Vererbung als Realisierung einer is-a Beziehung.

VIII: Vererbung. Unterklassen einer Klasse. Vererbung von Methoden und Instanzvariablen. Überschreiben von Methoden

Einführung in die Java- Programmierung

Eine Klasse beschreibt Objekte mit gleichen Attributen und Methoden.

Vorkurs C++ Programmierung

Einführung in die Programmierung

Einführung in die Programmierung

Algorithmen und Datenstrukturen

Programmieren II Vererbung. Programmieren II Vererbung. Programmieren II Vererbung. Programmieren II Vererbung. Einleitende Bemerkungen

Das Typsystem von Scala. L. Piepmeyer: Funktionale Programmierung - Das Typsystem von Scala

Klausur zur Einführung in die objektorientierte Programmierung mit Java

Nathan Burgener. Design by Contract. Modul SWE

Java Kurs für Anfänger Einheit 4 Klassen und Objekte

Der Aufruf von DM_in_Euro 1.40 sollte die Ausgabe 1.40 DM = Euro ergeben.

Applet Firewall und Freigabe der Objekte

Gebundene Typparameter

Objektbasierte Entwicklung

Probeklausur: Programmierung WS04/05

Klassenbeziehungen & Vererbung

Lösungsvorschläge. zu den Aufgaben im Kapitel 4

5. Abstrakte Klassen. Beispiel (3) Abstrakte Klasse. Beispiel (2) Angenommen, wir wollen die folgende Klassenhierarchie implementieren:

Ändern eines Kontotyps

Einführung in die objektorientierte Programmierung mit Java. Klausur am 19. Oktober 2005

.NET Code schützen. Projekt.NET. Version 1.0

Objektorientierte Programmierung OOP

Fachgebiet Informationssysteme Prof. Dr.-Ing. N. Fuhr. Programmierung Prof. Dr.-Ing. Nobert Fuhr. Übungsblatt Nr. 6

Java Einführung Umsetzung von Beziehungen zwischen Klassen. Kapitel 7

Einführung in die Java- Programmierung

Ersetzbarkeit, Client-Server Beziehungen

Programmierkurs Java

13. Tutorium zu Programmieren

Einführung in die Programmierung für Wirtschaftsinformatik

Einführung in Java. PING e.v. Weiterbildung Andreas Rossbacher 24. März 2005

Programmieren I. Strategie zum Entwurf von Klassen. Beispiele. Design von Klassen. Dr. Klaus Höppner. Beispiel: Bibliothek

Software Engineering Interaktionsdiagramme

Design by Contract with JML

Java Einführung Abstrakte Klassen und Interfaces

Objektorientierte Programmierung für Anfänger am Beispiel PHP

5. Abstrakte Klassen

Grundlagen von Python

Der lokale und verteilte Fall

Software Engineering Klassendiagramme Assoziationen

Code-Erzeugung aus UML-Klassendiagrammen

Große Übung Praktische Informatik 1

Innere Klassen in Java

BEISPIELKLAUSUR Softwareentwicklung:

Objektorientiertes JavaScript

Übung Grundlagen der Programmierung. Übung 03: Schleifen. Testplan Testergebnisse

Lösungen zu Übung 3 Objektorientierte Modellierung - Statisches Modell

Java Virtual Machine (JVM) Bytecode

Klassendiagramm. Kurzer Überblick über UML - Stand BlaBla

Programmieren I. Kapitel 7. Sortieren und Suchen

Programmiersprache 2 (C++) Prof. Dr. Stefan Enderle NTA Isny

Factory Method (Virtual Constructor)

1 Polymorphie (Vielgestaltigkeit)

SWE5 Übungen zu Software-Engineering

Die Bedeutung abstrakter Datentypen in der objektorientierten Programmierung. Klaus Kusche, September 2014

Leichte-Sprache-Bilder

Objects First With Java A Practical Introduction Using BlueJ. Mehr über Vererbung. Exploring polymorphism 1.0

Fakultät Angewandte Informatik Lehrprofessur für Informatik

teischl.com Software Design & Services e.u. office@teischl.com

Java Einführung Packages

How-to: Webserver NAT. Securepoint Security System Version 2007nx

- k Maximalwerte aus Menge mit n >> k Elementen (Rangfolgebestimmung von Suchmaschinen!) Die typische Operationen:

Javakurs zu Informatik I. Henning Heitkötter

Assoziation und Aggregation

Probeklausur Softwareengineering SS 15

Musterlösung zur Vorlesung Modellbasierte Softwareentwicklung Wintersemester 2014/2015 Übungsblatt 9

Delegatesund Ereignisse

Problemstellung. Informatik B - Objektorientierte Programmierung in Java. Vorlesung 24: Reflection 1. IDE und automatische Tests.

Übung 1 mit C# 6.0 MATTHIAS RONCORONI

Klassendefinitionen verstehen

Überblick. Lineares Suchen

Transkript:

2.4.3 Polymorphie (Wiederholung von Alp2) Sparbuch einsparbuch = new Sparbuch(3.0); Konto einkonto; KontoDrucker = new KontoDrucker(); KontoDrucker.setzeKonto(einSparbuch); einkonto = einsparbuch; Wie passt das zum Typsystem? public class Konto { } public class KontoDrucker{ public KontoDrucker(); public void setzekonto(konto k);..}; public class Sparbuch extends Konto {..} hs / fub alp3 9-ADT-7 1 Polymorphie Klassifizierung polymorpher Typsysteme Polymorphie (polymorphism) Universelle Polymorphie Ad-hoc-Polymorphie, Überladen (overloading) Inklusions-(Einschluss)-Polymorphie, z.b. Vererbung (inheritance) bei objektorientierten Sprachen parametrische Polymorphie, Generizität (genericity) hs / fub alp3 9-ADT-7 2 1

Generische Operationen in Java? Generische Operationen: typparametrisiert Nützlich, wenn Operationen unabhängig vom Typ Beispiel: Stack-Operationen unabhängig vom Typ der Stapelelemente interface Stack[T] {// model: [T] int N = 20; // inv: length < N = 20 void init(); // requires: True // effect: returns [] } Nicht in Standard-Java (aber in GJ: Generic Java und Java 1.5?) hs / fub alp3 9-ADT-7 3 Typverträglichkeit Wann ist Zuweisung typkorrekt? v = e Polymorphe Zuweisung Objektvariable einer abgeleiteten Klasse kann an Variable einer Oberklasse zugewiesen werden" class A {} class B extends A{} B y = new B(); A x = y; Objektvariable einer ein Interface implementierenden Klasse kann Variable vom Interface-Typ zugewiesen werden. hs / fub alp3 9-ADT-7 4 2

Typkorrektheit V, E Typen von v bzw. e v = e typkorrekt, wenn E typverträglich mit V analog: Zuweisung aktueller Parameter e zu formalen v: f(e); return Wert muss typverträglich sein zu Rückgabetyp der Methode. t1 f (t3 y ) {t2 x;. return x}; t5 a; t4 z = f(a) In Frage kommende Typen: V: interface, abstract class, class + Vererbung E: nur Klassentypen oder mehr? hs / fub alp3 9-ADT-7 5 Typverträglichkeit Anschaulich im Klassen- / Interface-Diagramm: T3 extends, implements T1 T1 verträglich mit T3 hs / fub alp3 9-ADT-7 6 3

Typverträglichkeit Typverträglichkeit, in Zeichen T T', in Java: T1 T3 genau dann, wenn Beachte: nicht symmetrisch a) T1 = T3 b) T1 ist Schnittstellentyp, der einen Schnittstellentyp T2 erweitert, für den gilt T2 T3. oder oder T1 ist Klassentyp, der einen Klassentyp T2 erweitert, für den gilt T2 T3. T1 ist Klassentyp, der einen Schnittstellentyp T2 implementiert, für den gilt T2 T3. hs / fub alp3 9-ADT-7 7 Typwandlung (type( cast) T1 x; (T3)x (T3)x typkorrekt, - wenn T1 T3 (nicht nötig) - wenn T3 T1 hat statischen* Typ T3 T1 T3 Wenn nicht T1 T3 Typprüfung: Wenn nicht D T3 für dynamischen Typ D von x: ClassCastException *statischer Typ: der bei Vereinbarung festgelegt, sonst dynamischer Typ hs / fub alp3 9-ADT-7 8 4

Nutzen der Polymorphie Beispiel "Konten" class GiroKonto abstract class Konto (oder interface) class SparBuch Wie iteriert man über Objekte unterschiedlichen Typs? " for all Konto k: k.zinsberechnung(); " hs / fub alp3 9-ADT-7 9 Nutzen der Polymorphie abstract class Konto{ public int zinsen(); public class GiroKonto extends Konto{ public int zinsen(){//berechnung f. Girokonten public class Sparbuch extends Konto{ public int zinsen(){//berechnung f. Sparbuch KontenListe allekonten = new Konto k; while (allekonten.hasmore()){ k = nextkonto(); v = k.zinsen();..} hs / fub alp3 9-ADT-7 10 5

Nutzen der Polymorphie und ohne Polymorphie? Etwa so: KontenListe allekonten = new GiroKonto k; Sparbuch s; while (allekonten.hasmore()){ if (typenextkonto() instanceof GiroKonto){ k = nextgirokonto(); v = k.zinsen();..} else {s = nextsparkonto(); v = s.zinsen();..} und wenn es einen weiteren Kontotyp gibt?? hs / fub alp3 9-ADT-7 11 Statischer und dynamischer Typ Welche Operation wird ausgeführt? k = nextkonto(); v = k.zinsen();. Code der Zinsberechnung von Giro- bzw. Sparkonto unterschiedlich! aber k instanceof Girokonto oder k instanceof Sparbuch Variablen haben statischen Typ durch Vereinbarung im Quellcode. und dynamischen Typ als Folge polymorpher Zuweisung Methodenaufruf richtet sich nach dynamischem Typ hs / fub alp3 9-ADT-7 12 6

Statischer und dynamischer Typ: Zusammenfassung Bezeichner haben durch Deklaration statischen Typ Als Folge polymorpher Zuweisungen kann ein Bezeichner verschiedenartige Objekte benennen oder "referenzieren" (spätes Binden) Typ des gerade referenzierten Objekts ist der dynamische Typ des Bezeichners Menge der dynamisch möglichen Typen in statisch typisierten objektorientierten Sprachen durch Vererbung eingeschränkt Keine dynamischen Typen in statisch getypten, nicht objektorientierten Sprachen (Pascal, Modula-2) ermöglicht "frühes Binden " - durch Übersetzer hs / fub alp3 9-ADT-7 13 Umdefinieren / verdecken ererbter Eigenschaften für Operationen: (Ü) andere Signatur: Überladen (E) gleiche Signatur, beide nicht statisch: Umdefinieren, Ersetzen (redefinition, overriding) (V) gleiche Signatur, beide statisch: Verdecken (hiding) (Blockstruktur!) class D { int i=0; static void foo();} class E extends D {int i=1; static void foo();} E e = new E(); e.foo(); D d = e; e.foo(); (F) sonst: alle anderen Eigenschaften (statischer) Fehler werden verdeckt. hs / fub alp3 9-ADT-7 14 7

Zugriffsregel: für Methoden ist der Typ des Objekts entscheidend für Felder der statische Typ (Referenztyp) für statische Methoden der statische Typ (!) Grund dafür: a int i=0 foo() int i=1; foo() Objekt vom Typ B in A definiert in B definiert Effizienter Attributzugriff wünschenswert / zwingend schon beim Übersetzen steht die Speicheradresse fest b B extends A B b = new b; A a = b; Regeln können explizit umgangen werden (super, this ---> Sprachspezifikation) a.i == 0 b.i == 1 a == b a.foo() b.foo() b.(super)foo(x) Implementierung (eine Möglichkeit) Referenz x Dispatch Vektor Objekt Felder a,b,.. Dispatch- vektor op1() op2() für alle Objekte einer Klasse Code der Methoden op1 Auswahl der dynamisch "richtigen" Operation durch Verändern des Verweises auf Dispatchvektors. op1 hs / fub alp3 9-ADT-7 16 8

class C1{ int a, b;void op1(){..}; void op2(){..}} C1 x,y,z; x Felder a,b,.. op1() op2() C1.op1 z y Felder a,b,.. Referenzen Objekte (nur Werte!) Klassen op2 C2 r,s; r s Felder a,b,.. a,r,.. Felder a,b, a,r,.. op1() op2'() opneu().. C2.op1 class C2 extends C1{ int a,r;.. void op1(){}; void opneu(){}} 2.2.4 Spezifikation und Vererbung T3 void op(int i){ // pre: P // post: Q..} void op(int i){ // pre:! P // post: Q'..}? T1 Wie sehen Modell, Invariante, Zusicherungen im Erbschaftsfall aus? In Programmiersprache nicht festgelegt. hs / fub alp3 9-ADT-7 18 9

Beispiel Abstract Class Payment int cash; int EC_total; Currency pay (Currency amount, Currency given); Abstract Class ECPayment Currency pay (Currency amount, Currency given); Wie muss pay () in ECPayment spezifiziert werden, damit konsistent zu Spezifikation Liberalisierung der Voraussetzungen abstract class Payment { // model: // inv.. // model: int cash, +, -, // inv total = cash + EC_total && cash > 0 // Currency pay (Currency amount, Currency given){; // pre: amount > 0 && given - amount >= 0 // post: total = CASH + amount + EC_TOTAL // returns given - amount } } Vorgehen: Modell ggf. erweitern Voraussetzungen können abgeschwächt werden Effekte verstärken hs / fub alp3 9-ADT-7 20 10

public class ECPayment extends Payment { // model: int cash, int EC_total, int total // inv: cash > 0 && EC_total >= 0 && total = // cash + ec-balance Currency pay (currency amount, Currency given){ // pre: amount >= 0 && given - amount >= 0 // post: cash = CASH (given-amount) && // EC_total = EC_TOTAL + given // returns amount- given // note: cheques may be cashed, see effects.} hs / fub alp3 9-ADT-7 21 Liberalisierung der Voraussetzung Vererbungsregel für Voraussetzung (precondition): Voraussetzung der Oberklassenmethode / Interface- Methode kann abgeschwächt werden precondition (super) => precondition (sub) amount >= 0 && given - amount >= 0 => amount > 0 && given - amount >= 0 Begründung: Aufrufender der Methode muss Voraussetzung sichern. Geschieht mit dieser Regel automatisch auch für Unterklasse / Implementierung des Interface. Konsistent zu polymorpher Zuweisung. hs / fub alp3 9-ADT-7 22 11

Verschärfung der Effekte (Nachbedingung) Regel für Effekte (Postcondition Rule): Precondition (Super) && postcondition (sub) => postcondition (super) Im Beispiel: cash > 0 && cash = CASH (given-amount) // pre (super) && EC_total = EC_TOTAL + given // post(sub) && cash = CASH (given-amount) // post(sub) => total = cash + EC_total = CASH (given amount) + EC_TOTAL + given = CASH amount + EC_TOTAL // post(super) hs / fub alp3 9-ADT-7 23 Spezifikation und Vererbung interface S {// model: a,b,.. // inv: I(a,b,..) op() throws // pre: P(a,b,..) // post: Q(a,b,..) } Bedeutung: interface I extends S { // model: x,y,.. Modellerweiterung a,b,.. // inv: J(a,b,..,x,y,..) && I(a,b,..) p() throws zusätzlich zu op // pre:..a,b,..,x,y,.. // post:..a,b,..,x,y,.. op() throws ersetzt altes op // pre: PP(a,b,..,x,y,..) P(a,b,..) // post: QQ(a,b,..,x,y,..) && Q(a,b,..) } (Eingeschränkter als Pre-/ Postcondition Regel, kommt aber so meist vor) hs / fub alp3 9-ADT-7 24 12