Skript Informatik B. Grundlagen der Software-Entwicklung

Ähnliche Dokumente
Einstieg in die Informatik mit Java

Überblick. Peer Kröger (LMU München) Einführung in die Programmierung WS 16/ / 861

Abschnitt 10: Typisierte Klassen

Realisierungsmöglichkeiten für parametrische Polymorphie

1 Einleitung Generizität Syntax... 2

Einführung in die Programmierung

Kapitel 8. Generische Klassen

Algorithmen und Datenstrukturen

Kapitel 8. Generische Klassen

Probleme ohne generische Typen

JAVA 5 Generics. Proseminar Programmiersprachen Thema Java 5 Generics 1

Philipp Güttler Progwerkstatt. Enums, Interfaces und Generics

Einstieg in die Informatik mit Java

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

12 Abstrakte Klassen, finale Klassen und Interfaces

Programmieren in Java

Programmierkurs Java

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

Generisches Programmieren. Generisches Programmieren

Javakurs für Anfänger

Einstieg in die Informatik mit Java

Faulheit professionell: Fertige Datenbehälter. Das Java-Collections-Framework Typsicherheit Generische Klassen

Vorlesung Informatik 2

Java Einführung Vererbung und Polymorphie. Kapitel 13

Grundzüge der Programmierung. Wiederverwendung VERERBUNG

Philipp Güttler Progwerkstatt Letzte Änderung: Enums, Interfaces, Generics und Threads

Programmieren in Java

Die abstrakte Klasse Expression:

TU München, Fakultät für Informatik Lehrstuhl III: Datenbanksysteme Prof. Alfons Kemper, Ph.D.

Programmieren in Java

Neuere Sprachelemente in Java

Johannes Unterstein - TINF16 - Java - Sommersemester 2017 JAVA. Weiterführende Spracheigenschaften

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

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

Vererbung, Polymorphie

Javakurs für Anfänger

Java Generics & Collections

Programmieren 2 16 Java Collections und Generizität

Programmieren I und II

Einstieg in die Informatik mit Java

Objektorientierte Konzepte

Probeklausur Java Einführung in die Informatik. Wintersemester 2016/2017

9. Vererbung Einführung in die Programmierung (fbw) Sommersemester 2008 Prof. Dr. Bernhard Humm Hochschule Darmstadt, fbi

Vorkurs Informatik WiSe 15/16

Informatik II Übung 6

Heute. Nachbetrachtung Wissensüberprüfung. Sortieren Interface Comparable TreeSet Sortieren von Arrays: Arrays.sort() 3.12.

Java Vererbung. Inhalt

Kapitel 5: Interfaces

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

Inhaltsverzeichnis. 4.9 Aufgaben... 63

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

FH D. Objektorientierte Programmierung in Java FH D FH D. Prof. Dr. Ing. André Stuhlsatz. Wiederholung: Interfaces

Vererbung. Martin Wirsing. Ziele. Vererbung

Informatik II Übung 06. Benjamin Hepp 5 April 2017

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

Dynamische Typinformation A01 OOP. Dynamische Typinformation

Probeklausur Java Einführung in die Informatik. Wintersemester 2017/2018

Objektorientierte Programmierung Studiengang Medieninformatik

Tafelübung 07 Algorithmen und Datenstrukturen

1 Polymorphie (Vielgestaltigkeit)

Repetitorium Informatik (Java)

Java für Bauingenieure

Klassen als Objekte. Smalltalk vs. Objective-C. Self-Nachrichten an Klassen in Objective-C. Klassen als Objekte. Smalltalk: Everything is an object

Kapitel 8. Programmierkurs. Methoden. 8.1 Methoden

4. Vererbung Die Klasse Object. Die Klasse Object

Programmieren I und II

Programmieren I und II

Programmieren in Java

C++ - Objektorientierte Programmierung Polymorphie

Vererbung. Oberklassen und Unterklassen

4. Objektorientierte Programmierung mit C++

Grundzüge der Programmierung. Wiederverwendung POLYMORPHIE

Neben der Verwendung von Klassen ist Vererbung ein wichtiges Merkmal objektorientierter

Typverträglichkeit bei Feldern mit Klassentyp als Basistyp

Das Interface-Konzept am Beispiel der Sprache Java

9. Kapitel GENERICS. Techniken der Programmentwicklung Prof. Dr. Wolfgang Schramm

9. Vererbung und Polymorphie. Informatik Vererbung und Polymorphie 1

Allgemeine Hinweise:

Javakurs FSS Lehrstuhl Stuckenschmidt. Tag 3 - Objektorientierung

Programmiermethodik 2. Klausur Lösung

Einleitung Typsystem Typisierung Zusammenfassung Literatur. Typisierung. Effiziente Programmierung. Thomas Schnieders

14 Abstrakte Klassen, finale Klassen, Interfaces

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

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

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

Polymorphie. 15. Java Objektorientierung II

Algorithmen und Datenstrukturen 07

Programmieren 1 09 Vererbung und Polymorphie

TU München, Fakultät für Informatik Lehrstuhl III: Datenbanksysteme Prof. Alfons Kemper, Ph.D.

Informatik II. Übungsstunde 6. Distributed Systems Group, ETH Zürich

14 Abstrakte Klassen, finale Klassen, Interfaces

1 Abstrakte Klassen, finale Klassen und Interfaces

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

Polymorphie. 15. Java Objektorientierung II

Software Entwicklung 1

Java I Vorlesung Generics und Packages

Einstieg in die Informatik mit Java

Erste Java-Programme (Java Wiederholung & Vererbung)

OOP. Tagesprogramm. Dynamische Typinformation. Homogene Übersetzung der Generizität. Generizität und Typumwandlungen

Programmieren I. Kapitel 8. Vererbung

Transkript:

Skript Informatik B Grundlagen der Software-Entwicklung Sommersemester 2013 - Teil 5 - Copyright, 2012 2014, Elke Pulvermüller

Inhalt 0 Einleitung 1 Grundlegende objektorientierte Konzepte (Fundamental Concepts) 2 Basiswissen Software-Entwicklung 3 Wichtige objektorientierte Konzepte (Major Concepts) 4 Fehlerbehandlung 5 Generizität (Generics) 6 Polymorphie / Polymorphismus 7 Klassenbibliotheken (Java Collection Framework) 8 Persistenz wird schrittweise erweitert Copyright Elke Pulvermüller, 2013-143 -

Kapitel 5: Generizität (Generics) 5.1 Nutzen und mögliche Alternativen 5.2 Umsetzung 5.3 Erweiterungen 5.4 Modellierung in UML 5.5 Generizität bei Objekt- und Klassenmethoden [Boo94] Vorbemerkung: Generizität kann als Konzept sowohl unter dem Thema Abstraktion wie auch unter dem Thema Typsysteme eingeordnet werden. Copyright Elke Pulvermüller, 2013-144 -

5.1 Nutzen und mögliche Alternativen Beispiel in Java: Wir wollen eine Box, in die verschiedenartige Objekte abgelegt (und verwaltet) werden können (z.b. Student-Objekte, String-Objekte, Integer-Objekte). Die Implementierung(slogik) ist weitgehend unabhängig vom Typ des verwalteten Objekts. Folgende Realisierung in Java führt zu drei sehr ähnlichen Klassen: public class StudentBox { private Student obj; public void add(student o) { this.obj = o; public Student get() { return obj; public class StringBox { private String obj; public void add(string o) { this.obj = o; public String get() { return obj; public class IntegerBox { private Integer obj; public void add(integer o) { this.obj = o; public Integer get() { return obj; Erster Versuch zur Verbesserung: Nutzung des Substitutionsprinzips Wir wollen Redundanz bei der Box vermeiden: Wir bilden eine Klasse, die beliebige Objekte verwaltet Wiederverwendung Wir erweitern das Beispiel gleichzeitig: Es sollen ein paar mehr Objekte in die Box (z.b. drei: obj1, obj2, obj3). public class Box { private Object obj1; private Object obj2; private Object obj3; public void add(object o1, Object o2, Object o3) { this.obj1 = o1; this.obj2 = o2; this.obj3 = o3; Object String Person Student public Object get Copyright Elke Pulvermüller, 2013-145 -

Problem mit dem ersten Verbesserungsversuch: public class Box { String private Object obj1; private Object obj2; Person private Object obj3; Student public void add(object o1, Object o2, Object o3) { this.obj1 = o1; this.obj2 = o2; this.obj3 = o3; public Object get Wir erhalten eine Mischwaren -Box: Wir wissen nicht was wirklich enthalten ist zur Verwendung sind Typecasts notwendig Beispiel für den Zugriff auf die Elemente in diesem Versuch: Object p = abox.getobj1(); p.getmatnr(); Compilerfehler (die Typprüfung ergibt, dass die Klasse Object keine Methode getmatnr() hat) Student p = (Student)aBox.getObj1(); p.getmatnr(); ClassCastException Unser Versuch hat zu unschönen Casts und zu keiner typsicheren Lösung geführt. Wir wollen zusätzlich mehr Typkontrolle bzw. Typsicherheit. Copyright Elke Pulvermüller, 2013-146 -

Zweiter Versuch zur Verbesserung: Einsatz von Generizität mit mehr Typsicherheit Beispiel in Java: public class Box<T> { private T element1; private T element2; public void add(t e1, T e2) { this.element1 = e1; this.element2 = e2; public T getelement1() { return e1; Auch Interfaces können mit Generizität erstellt werden: interface InterfaceName<T> { Definition eines generischen Typs, der (nur) innerhalb der Klasse verwendet wird / werden kann: class ClassName<T> { Formal Type Parameter T: Platzhalter für einen beliebigen Objekttyp Typsichere Erzeugung von Box-Instanzen zu unserer Box<T>-Klasse: Box<String> b = new Box<String>(); Es gilt: Eine parametrisierte/parametrisierbare Klasse ist eine Klasse mit einem oder mehreren generischen formalen Parametern (nicht leere Parameterliste). Achtung wegen variierender Begriffsverwendung: Parametrisierbare, parametrisierte Klasse, Bound Element, Template-Klasse, Template Eine parametrisierbare Klasse definiert eine Familie von Klassen: Sie ist eine mit generischen formalen Parametern versehene Schablone, mit der gewöhnliche (d.h. nichtgenerische) Klassen erzeugt werden können. Interna der Klasse (z.b. Attribute) können von den Parametern abhängig definiert sein. Generische Typen gibt es auch in Java (seit Java Version 1.5). Generizität in Java heißt Generics. Achtung: In Java gibt es Generics nicht für primitive Datentypen oder mit primitiven Datentypen als Typparameter! Generische Typen werden auch in anderen OO-Sprachen unterstützt (z.b. in C++ und Eiffel). In diesen können teils auch primitive Datentypen als Typparameter verwendet werden (z.b. in C++). Typunsichere Erzeugung von Box-Instanzen zu unserer Box<T>-Klasse in Java: Box b = new Box(); Generische Klassen können in Java vor allem aus Kompatibilitätsgründen mit älteren Java- Versionen auch ohne Beachtung der Typparameter genutzt werden. Man spricht dann von Raw Type. Die Nutzung ist in diesem Fall typunsicher, da der Compiler keine Typprüfung durchführen kann (analog zur Verwendung von Object). Raw Types sollten im Programm daher vermieden werden. Copyright Elke Pulvermüller, 2013-147 -

Zusammenfassend: Generizität bedeutet: Typunabhängigkeit. Es spielt keine Rolle, welche Arten von Objekten bearbeitet werden, solange das passende Interface implementiert ist. Parametrisierte Typen: Platzhalter, mit denen erst zu einem späteren Zeitpunkt festgelegt wird, für welchen Typ sie stehen. 5.2 Umsetzung Hat der Entwickler generische Typen verwendet, müssen Compiler und Laufzeitumgebung damit umgehen. Generische Typen können für die Abarbeitung grundsätzlich auf zwei Arten umgesetzt werden: (1) Heterogene Realisierung: Für jeden aktuellen Typparameter wird individueller Code erzeugt (z.b. je eine eigene Klasse für StringBox, StudentBox, IntegerBox). (2) Homogene Realisierung: Für jede parametrisierte Klasse wird genau eine Klasse erzeugt. Statt des generischen Typs wird der Typ Object eingesetzt (Löschen der Typinformationen: type erasure). Für jeden konkreten Typ werden Typanpassungen in die Anweisungen eingesetzt. In Java: Homogene Realisierung (der Compiler löscht bei generischen Typen alle Typinformationen). Die technische Umsetzung geschieht meist mit einer Makrotechnik (d.h. durch Textersetzung, die noch vor dem Übersetzen durchgeführt wird). 5.3 Erweiterungen 5.3.1 Mehrere Typparameter Verwendung mehrerer Typparameter (am Beispiel der Programmiersprache Java): public class Box<T1,T2> { private T1 element1; private T2 element2; public void add(t1 e1, T2 e2) { this.element1 = e1; this.element2 = e2; public T1 getelement1() { return element1; Erzeugung von Instanzen von Klassen, die mit mehreren Typparametern definiert sind: Box<String,Student> b = new Box<String,Student>(); Copyright Elke Pulvermüller, 2013-148 -

5.3.2 Typeinschränkungen: Bounds Problem am Beispiel in Java: Arbeiten mit generischen Typen und Typsicherheit public class Box<T> { private T element; public void add(t e) { this.element = e; public T getelement() { return element; Vergleichsoperator ist nicht auf beliebigen Typen definiert Compiler-Fehler Wir brauchen eine Typeinschränkung: Sicherstellung, dass alle generischen Typen einen Vergleichsoperator definieren public boolean largeras(t val) { if (val.compareto(this.getelement()) > 0) return true; else return false; Abhilfe: Wir binden die Typen an Schnittstellen public class Box<T extends Comparable<T>> { private T element; public boolean largeras(t val) { if (val.compareto(this.getelement()) > 0) return true; else return false; Erzeugung: Box<Student> b = new Box<Student>(); Typbindung (Bound): Typparameter an ein oder mehrere Schnittstellen binden Voraussetzung: Die Klasse Student muss das Interface Comparable implementieren (und damit die Methode compareto(t o)). Copyright Elke Pulvermüller, 2013-149 -

Allgemeine Form in Java: Mehrfache Einschränkung des Typparameters durch Klassen und/oder Interfaces <T extends T1 & I2 & I3 > Klasse oder Schnittstelle an erster Stelle nur Interfaces Voraussetzung: Der Typ des Typparameters muss von der Bound (im Beispiel oben z.b. von T1, I2, I3, ) abgeleitet sein bzw. diese implementieren. Der Compiler prüft, ob der konkrete Typ, der für den Typparameter später eingesetzt wird, zu den angegebenen Bounds passt. Beispiel: public class Box<T extends Comparable<T> & Serializable> implements Serializable { Es können zwei Arten von Typeinschränkungen (Bounds) unterschieden werden: 1. Upper Bounds (in Java durch Verwendung von extends ): Der Typ muss der angegebenen Bound entsprechen oder eine Subklasse davon sein. Die Bound ist also in der Klassenhierarchie eine Beschränkung nach oben. 2. Lower Bounds: Der Typ muss der angegebenen Bound entsprechen oder eine Superklasse dazu sein. Beispiel in Java: Box<? super Person> In diesem Java-Beispiel wäre an der Stelle des? der Typ Person oder die Superklasse Object möglich. Copyright Elke Pulvermüller, 2013-150 -

5.4 Modellierung in UML Beispiel: Darstellung der generischen Box in UML <<bind>> (T->String n->100) StringBox Box element: T[0..n] add(e1:t,e2:t) T, n:int <<bind>> (T->Student n->10) StudentBox Parametrisierte Klasse (Parameterized Class, Template) mit zwei formalen Parametern (Template Parameter) public class Box<T,int> { // Schablonenbindungsbeziehung Schablonenklasse in Kurzform: (Notationsvariante) Box<T,n:int> Mit Bindung: Box<T->String,n->100> Anonym gebundene Klassen: In der Notationsvariante haben wir im Gegensatz zur ersten Darstellungsvariante eine anonym gebundene Klasse: Die neue Box-Klasse, die nach der Parametrisierung entsteht, hat keinen Namen. In der ersten Darstellung hatten wir eigene Namen für die Klassen (z.b. StringBox). Nutzung von generischen Typen in unserem Beispiel: Bindung aktueller Typparameter an formale Parameter: Box<String,100> stringbox; Box<Student,10> studentbox; Das Ergebnis der Bindung ist ein Bound Element bzw. eine Parameterized Class. Variable stringbox und studentbox haben passend gewählte Variablennamen. Der Typ mit dem sie deklariert sind, ist jeweils aber ohne eigenen Namen. Bemerkungen: In Java gibt es nur anonym gebundene Klassen. Java unterstützt keine primitiven Datentypen als Typparameter bei Generics. Der Typparameter int, der im Beispiel oben verwendet wird, funktioniert daher in Java nicht!. Copyright Elke Pulvermüller, 2013-151 -

5.5 Generizität bei Objekt- und Klassenmethoden Bei der Generizität an Objekt- und Klassenmethoden wird der generische Typ an der Methode (oder am Konstruktor) anstelle an der Klassendefinition verwendet. Beispiel in Java: public class MyUtil { public static<t> T random(t m, T n) { return Math.random() > 0.5? m:n; Klassenmethode auf beliebigem Typ Eine Nutzung ohne Typangabe ist möglich. Vorteil einer parametrisierten Methode: Typprüfung. Nutzung im Beispiel: String s1 = MyUtil.random( Essen, Schlafen ); String s2 = MyUtil.<String>random( Essen, Schalfen ); String s3 = MyUtil.random(1, Schlafen ); korrekt falsch (statisch erkannt) Geschachtelte generische Typen: public static <U> void fillboxes(u u, List<Box<U>> boxes) { for (Box<U> box : boxes) { box.add(u); Nutzung ohne konkrete Typangabe, aber mit Typprüfung (Konsistenz der Parameter) Crayon red = ; List<Box<Crayon>> crayonboxes = ; Box.<Crayon>fillBoxes(red,crayonBoxes); Copyright Elke Pulvermüller, 2013-152 -

Kapitel 6: Polymorphie / Polymorphismus [Boo94] Copyright Elke Pulvermüller, 2013-153 -

Polymorph = Vielgestaltigkeit (griech.): Eigenschaft [eines Bezeichners], sich in Abhängigkeit von der Umgebung, in der er verwendet wird, unterschiedlich darzustellen (Gegenteil: Monomorphie). In der Programmierung z.b.: - Eine Variable bzw. eine Methode kann gleichzeitig mehrere Typen haben. - Verschiedene Objekte können auf die gleiche Nachricht unterschiedlich reagieren. Beispiel: Wir können die Nachricht draw an die jeweilige Form schicken (d.h. die gleiche Nachricht). Das jeweilige Form-Objekt reagiert dabei unterschiedlich (zeichnet sich verschieden). draw() Ausgehend von dieser grundsätzlichen Bedeutung von Polymorphie, können verschiedene konkrete Umsetzungen in der Programmwelt klassifiziert werden. Arten von Polymorphie: Polymorphie taucht in der Programmierung an verschiedenen Stellen auf. Eine Orientierung zur Unterscheidung der Polymorphie-Arten gibt Strachey 1967 und Cardelli / Wegener, 1985. Polymorphism Ad hoc Polymorphism Universal Polymorphism Ad hoc Polymorphie: Prinzipiell nur scheinbar polymorph. Die Einheit hat tatsächlich nur einen Typ. Die Syntax spielt polymorphes Verhalten vor. Universelle Polymorphie: Echte Polymorphie Die gleiche Arbeit wird auf vielen verschiedenen Typen ausgeführt. Copyright Elke Pulvermüller, 2013-154 -

Ad hoc Polymorphism Overloading (Überladen) Coercion (Typumwandlung) Verschiedene Methoden mit gleichem Namen, die auf verschiedenen Mengen von Parametertypen operieren. Implizite Typumwandlung von Werten; Beispiel: An die Operation (z.b. +) übergebene Typen werden in den passenden Typ (z.b. int) umgewandelt. Universal Polymorphism Parametric Polymorphism Inclusion Polymorphism Der Parameter für den tatsächlich verwendeten Datentyp wird übergeben (generische Programmierung, z.b. Generics in Java). 1. Einer Variablen können Objekte unterschiedlichen Typs zugewiesen werden (der Typ beschreibt nur die Schnittstelle): Substitutionsprinzip. 2. Beim Aufruf einer Operation wird abhängig vom Objekt die entsprechende Methode ausgewählt (Überschreiben mit dynamischem Binden). Copyright Elke Pulvermüller, 2013-155 -