Kritische Betrachtung

Slides:



Advertisements
Ähnliche Präsentationen
der Universität Oldenburg
Advertisements

Objektorientierte Programmierung
der Universität Oldenburg
der Universität Oldenburg
DVG Einfache Klassen Einfache Klassen. DVG Einfache Klassen 2 Strukturen Beispiel: Personendaten bestehen aus –String name –String vorname.
Vorlesung: 1 Betriebliche Informationssysteme 2003 Prof. Dr. G. Hellberg Studiengang Informatik FHDW Vorlesung: Betriebliche Informationssysteme Teil3.
LS 2 / Informatik Datenstrukturen, Algorithmen und Programmierung 2 (DAP2)
Zusammenfassung der Vorwoche
PKJ 2005/1 Stefan Dissmann Vorwoche - Klasse public class Studierende { private String name, vorname, studiengang; private int matNr, semester; private.
Kapselung , toString , equals , Java API
Modelle und Methoden der Linearen und Nichtlinearen Optimierung (Ausgewählte Methoden und Fallstudien) U N I V E R S I T Ä T H A M B U R G November 2011.
der Universität Oldenburg
1 JIM-Studie 2010 Jugend, Information, (Multi-)Media Landesanstalt für Kommunikation Baden-Württemberg (LFK) Landeszentrale für Medien und Kommunikation.
= = = = 47 = 47 = 48 = =
Java: Objektorientierte Programmierung
Java: Dynamische Datentypen
Indirekte Adressierung
Java: Referenzen und Zeichenketten
Java: Grundlagen der Objektorientierung
Abstrakte Klassen.
Konstruktoren.
EINI-I Einführung in die Informatik für Naturwissenschaftler und Ingenieure I Kapitel 7 Claudio Moraga, Gisbert Dittrich FBI Unido
Universität Dortmund, Lehrstuhl Informatik 1 EINI II Einführung in die Informatik für Naturwissenschaftler und Ingenieure.
Vorlesung: 1 Betriebliche Informationssysteme 2003 Prof. Dr. G. Hellberg Studiengang Informatik FHDW Vorlesung: Betriebliche Informationssysteme Teil2.
Institut für Kartographie und Geoinformation Prof. Dr. Lutz Plümer Diskrete Mathematik I Vorlesung Listen-
Programmieren mit JAVA
Programmieren mit JAVA
PRJ 2007/1 Stefan Dissmann Motivation Problem: Benutztes Objekt kennt den Kontext seiner Nutzung nicht. Daher kann es in besonderen Situationen keine Entscheidung.
PKJ 2005/1 Stefan Dissmann Methoden (Motivation) Idee: Identische Programmabschnitte zusammenfassen und mit einem Namen versehen Vorteile: Übersichtlichkeit.
Vererbung Spezialisierung von Klassen in JAVA möglich durch
PRJ 2007/1 Stefan Dissmann Motivation Problem: gleiche Datenstrukturen werden für verschiedene Objekte gebraucht: z.B. Listen von Studierenden, Kunden,
PKJ 2005/1 Stefan Dissmann Ausblick Es fehlen noch: Möglichkeiten zum Strukturieren größerer Programme Umgang mit variabler Zahl von Elementen Umgang mit.
PKJ 2005/1 Stefan Dissmann Rückblick auf 2005 Was zuletzt in 2005 vorgestellt wurde: Klassen mit Attributen, Methoden und Konstruktoren Referenzen auf.
PKJ 2005/1 Stefan Dissmann Zusammenfassung Bisher bekannt: Einfache Typen (z.B. int, char, boolean) Zusammengesetzte Typen (Felder, auch String) Operatoren.
PKJ 2005/1 Stefan Dissmann Zusammenfassung Vorwoche Programm besteht aus mehreren Bestandteilen: Schlüsselwörter Sonderzeichen Bezeichner Kommentare Texte.
PKJ 2005/1 Stefan Dissmann Zusammenfassung Bisher im Kurs erarbeitete Konzepte(1): Umgang mit einfachen Datentypen Umgang mit Feldern Umgang mit Referenzen.
PKJ 2005/1 Stefan Dissmann Zusammenfassung der Vorwoche Variable stehen für (einen) Wert, der sich im Programmablauf ändern kann. Variablen besitzen einen.
Zusammenfassung Vorwoche
PKJ 2005/1 Stefan Dissmann Klassenhierarchie Person Kunde Goldkunde Lieferant Object.
PKJ 2005/1 Stefan Dissmann Zusammenfassung Vorwoche Methoden sind mit einem Namen versehene Programmabschnitte besitzen Rückgabetyp, Namen, Parameterliste.
DVG Klassen und Objekte
DVG Einfache Klassen 1 Einfache Klassen. 2DVG Einfache KlassenStrukturen Beispiel: Personendaten bestehen aus String name String name.
Prof. Dr. Bernhard Wasmayr VWL 2. Semester
Seite 1 Interface - Konzept Ein Interface führt einen neuen Datentyp ein: interface Frau {... } Das Interface enthält Deklarationen ( keine Definitionen.
Rechneraufbau & Rechnerstrukturen, Folie 12.1 © W. Oberschelp, G. Vossen W. Oberschelp G. Vossen Kapitel 12.
PRJ 2007/1 Stefan Dissmann Verkettete datenstruktur: Liste Problem: Liste, die eine beliebige Zahl von Elementen verwaltet Operationen: Erzeugen, Anfügen,
20:00.
„Küsse deine Freunde“ – FlexKom-App teilen
Zusatzfolien zu B-Bäumen
für Weihnachten oder als Tischdekoration für das ganze Jahr
Generalisierung/Spezialisierung Subtypisierung/Vererbung
Einführung in die Programmierung Wintersemester 2008/09 Prof. Dr. Günter Rudolph Lehrstuhl für Algorithm Engineering Fakultät für Informatik TU Dortmund.
Einführung in die Programmierung Wintersemester 2009/10 Prof. Dr. Günter Rudolph Lehrstuhl für Algorithm Engineering Fakultät für Informatik TU Dortmund.
Javakurs FSS 2012 Lehrstuhl Stuckenschmidt
OOP-Begriffe Abstraktion Modellieren Klasse Objekt Attribute Methoden
PROCAM Score Alter (Jahre)
Ertragsteuern, 5. Auflage Christiana Djanani, Gernot Brähler, Christian Lösel, Andreas Krenzin © UVK Verlagsgesellschaft mbH, Konstanz und München 2012.
Symmetrische Blockchiffren DES – der Data Encryption Standard
1 (C)2006, Hermann Knoll, HTW Chur, FHO Quadratische Reste Definitionen: Quadratischer Rest Quadratwurzel Anwendungen.
Zahlentheorie und Zahlenspiele Hartmut Menzer, Ingo Althöfer ISBN: © 2014 Oldenbourg Wissenschaftsverlag GmbH Abbildungsübersicht / List.
MINDREADER Ein magisch - interaktives Erlebnis mit ENZO PAOLO
EPROG Tutorium #5 Philipp Effenberger
1 (C)2006, Hermann Knoll, HTW Chur, FHO Quadratische Reste Definitionen: Quadratischer Rest Quadratwurzel Anwendungen.
Schutzvermerk nach DIN 34 beachten 20/05/14 Seite 1 Grundlagen XSoft Lösung :Logische Grundschaltung IEC-Grundlagen und logische Verknüpfungen.
Programmiervorkurs WS 2014/15 Instanzmethoden
Datum:17. Dezember 2014 Thema:IFRS Update zum Jahresende – die Neuerungen im Überblick Referent:Eberhard Grötzner, EMA ® Anlass:12. Arbeitskreis Internationale.
OOP-Begriffe Abstraktion Modellieren Klasse Objekt Attribute Methoden
1 Medienpädagogischer Forschungsverbund Südwest KIM-Studie 2014 Landesanstalt für Kommunikation Baden-Württemberg (LFK) Landeszentrale für Medien und Kommunikation.
Institut für Kartographie und Geoinformation Prof. Dr. Lutz Plümer, Dr. Thomas H. Kolbe Einführung in die Programmierung mit Java 9. Vorlesung WS 2001/2002.
Venusspiegel und Marsschild
 Präsentation transkript:

Kritische Betrachtung Bisher implementiert: Listen für Werte des Typs int über Elemente der Klasse intElement Liste für double Liste für Studierende Liste von Listen von int erfordern jeweils neue, fast identische Implementierung der Klassen für Elemente und Liste.

Kritische Betrachtung (Fortsetzung) Analyse: Elemente haben immer Referenzen auf Nachfolger (und Vorgänger). Liste verknüpft, löscht und durchläuft immer Elemente. Elemente unterscheiden sich im Typ der abgelegten Werte. Liste benötigt möglicherweise typspezifische Vergleiche. Idee: Elemente und Liste allgemein formulieren und anschließend nur an wenigen Stellen spezialisieren.

Vererbung Spezialisierung von Klassen in JAVA möglich durch Konzept der Vererbung

Vererbung Wenn eine Klasse A die Klasse B spezialisiert, also die Klasse A von der Klasse B erbt, übernimmt sie alle Attribut- und Methoden-Deklarationen von B. A heißt dann Unterklasse von B oder Subklasse von B B heißt dann Oberklasse von A oder Superklasse von A

Vererbung Oberklasse Unterklasse

Vererbung Beispiel: public class Person { private String name, vorname, wohnort; public Person(String n, String v, String w) { name = n; vorname = v; wohnort = w; } public String toString() { return name + ", " + vorname

Vererbung Beispiel: public class Person { private String name, vorname, wohnort; public Person(String n, String v, String w) { name = n; vorname = v; wohnort = w; } public String toString() { return name + ", " + vorname public class Kunde extends Person {{ private int nummer;

Vererbung Beispiel: public class Person { private String name, vorname, wohnort; public Person(String n, String v, String w) { name = n; vorname = v; wohnort = w; } public String toString() { return name + ", " + vorname public class Kunde extends Person { private int nummer;

+ Vererbung Beispiel: public class Person { private String name, vorname, wohnort; public Person(String n, String v, String w) { name = n; vorname = v; wohnort = w; } public String toString() { return name + ", " + vorname public class Kunde extends Person { private int nummer; +

Vererbung bedeutet: public class Kunde extends Person {{ private int nummer; } bedeutet: Kunde wird als Unterklasse von Person definiert. Person wird dadurch Oberklasse von Kunde. Kunde hat geerbt: die öffentliche Methode toString, die privaten Attribute name, vorname und wohnort. In Kunde wird definiert: das private Attribut nummer.

Vererbung Person Kunde

Vererbung Was bringt Vererbung?

Vererbung Was bringt Vererbung? verringerten Schreibaufwand Gleichförmigkeit reduzierten Änderungsaufwand vereinfachtes Testen aber auch: ständiges Beachten der gegenseitigen Abhängigkeiten

Fragen Was geht wie in der Klasse Kunde? Zugriff auf die geerbten privaten Attribute name, vorname und wohnort, z.B. Definition eines Konstruktors für alle vier Attribute, z.B. gemeinsamer Text aus einigen Attributen, z.B. gemeinsamer Text aus allen Attributen, Zulässigkeit von Referenzen auf Ober- und Unterklasse.

Vererbung – Konstruktor in Unterklasse Beispiel: public class Person { private String name, vorname, wohnort; public Person(String n, String v , String w) { name = n; … } public String toString() { return name + ", " + vorname } } public class Kunde extends Person { private int nummer;

Vererbung – Konstruktor in Unterklasse Beispiel: public class Person { private String name, vorname; public Person(String n, String v , String w) { name = n; … } public String toString() { return name + ", " + vorname } } public class Kunde extends Person { private int nummer; public Kunde (String n, String v, String w, int n) { name = n; vorname = v; wohnort = w; nummer = n;

Vererbung – Konstruktor in Unterklasse Beispiel: public class Person { private String name, vorname; public Person(String n, String v , String w) { name = n; … } public String toString() { return name + ", " + vorname } } public class Kunde extends Person { private int nummer; public Kunde (String n, String v, String w, int n) { name = n; nicht erlaubt, da private in Oberklasse vorname = v; nicht erlaubt, da private in Oberklasse wohnort = w; nicht erlaubt, da private in Oberklasse nummer = n;

Vererbung – Konstruktor in Unterklasse Beispiel: public class Person { private String name, vorname, wohnort; public Person(String n, String v , String w) { name = n; … } public String toString() { return name + ", " + vorname } } public class Kunde extends Person { private int nummer; public Kunde (String n, String v, String w, int n) { super(n, v, w); Aufruf des Konstruktors erlaubt, da public nummer = n;

Vererbung – Texterzeugung in Unterklasse Beispiel: public class Person { private String name, vorname, wohnort; public Person(String n, String v , String w) { name = n; …} public String toString() { return name + ", " + vorname } } public class Kunde extends Person { private int nummer; public Kunde (String n, String v, String w, int n) { super(n, v, w); nummer = n; public String ???() { return ??? + ", " + nummer;

Vererbung – Texterzeugung Version 1 Beispiel: public class Person { private String name, vorname, wohnort; public Person(String n, String v , String w) { name = n; … } public String toString() { return name + ", " + vorname } } public class Kunde extends Person { private int nummer; public Kunde (String n, String v, String w, int n) { super(n, v, w); nummer = n; public String zuText() { return toString() + ", " + nummer;

Vererbung – Texterzeugung Version 2 Fragen: Ist Überdefinieren einer Methode in der Unterklasse möglich, also toString() in Ober und Unterklasse? Und: Wie wird dann der Namenskonflikt gelöst, um beide Versionen von toString() zu unterscheiden?

Vererbung – toString in Unterklasse Beispiel: public class Person { private String name, vorname, wohnort; public Person(String n, String v, String w) { name = n; … } public String toString() { return name + ", " + vorname } } public class Kunde extends Person { private int nummer; public Kunde (String n, String v, String w, int n) { super(n, v, w); nummer = n; public String toString() { return super.toString() + ", " + nummer;

Vererbung – toString in Unterklasse Zusammenfassung: super(…) bezeichnet den Konstruktor der Oberklasse. Überdefinieren von Methoden in Unterklassen ist möglich. super. … erlaubt den Zugriff auf Komponenten der Oberklasse.

Erweiterung der Klasse Kunde Problem: Gewünscht ist Methode in Kunde, die wohnort ändern kann, wenn zugleich die richtige Kundenummer angegeben wird.

Erweiterung der Klasse Kunde Problem: Gewünscht ist Methode in Kunde, die wohnort ändern kann, wenn zugleich die richtige Kundenummer angegeben wird. Lösung: Erweiterung der Klasse Person um die Methoden gibOrt() und setzeOrt(String w) aber: Nur die Unterklasse soll Änderung durchführen können, daher private zu wenig und public zuviel.

Erweiterung der Klasse Kunde Problem: Gewünscht ist Methode in Kunde, die wohnort ändern kann, wenn zugleich die richtige Kundenummer angegeben wird. Lösung: Erweiterung der Klasse Person um die Methoden gibOrt() und setzeOrt(String w) daher: Zugriffsrecht protected nutzen Unterklassen dürfen zugreifen, andere Klassen nicht!

Überarbeitete Klasse Person Beispiel: public class Person { private String name, vorname, wohnort; public Person(String n, String v, String w) { name = n; vorname = v; wohnort = w; } public String toString() { return name + ", " + vorname } public String gibOrt() { return wohnort; protected void setzeOrt(String w) { wohnort = w;

Überarbeitete Klasse Kunde Beispiel: public class Kunde extends Person { private int nummer; public Kunde (String n, String v, String w, int n) { super(n, v); nummer = n; } public String toString() { return super.toString() + ", " + nummer; public aendereOrt(int n, String w) { if (nummer == n) wohnort = w;

Überarbeitete Klassen Zusammenfassung: Person erlaubt nur Objekten von erbenden Klassen das Setzen des Ortes: protected void setzeOrt(…) Kunde erlaubt allen Objekten das Ändern des Ortes, sofern die richtige Kundennummer angegeben wird: public void aendereOrt(…)

Referenzen auf Ober- und Unterklassen Beispiel: Person p = new Person (“Meier“, “Jana“, “Dortmund“); Kunde k = new Kunde (“Schmidt“, “Axel“, “Bochum“, 103); // Methoden in beiden Klassen vereinbart System.out.println(p.toString()); System.out.println(k.toString());

Referenzen auf Ober- und Unterklassen Beispiel: Person p = new Person (“Meier“, “Jana“, “Dortmund“); Kunde k = new Kunde (“Schmidt“, “Axel“, “Bochum“, 103); // Methoden in beiden Klassen vereinbart System.out.println(p.toString()); System.out.println(k.toString()); // Methode aus Person vererbt System.out.println(p.gibOrt()); System.out.println(k.gibOrt());

Referenzen auf Ober- und Unterklassen Beispiel: Person p = new Person (“Meier“, “Jana“, “Dortmund“); Kunde k = new Kunde (“Schmidt“, “Axel“, “Bochum“, 103); // Methoden in beiden Klassen vereinbart System.out.println(p.toString()); System.out.println(k.toString()); // Methode aus Person vererbt System.out.println(p.gibOrt()); System.out.println(k.gibOrt()); // Methode nur in Kunde k.aendereOrt(103, “Unna“);

Referenzen auf Ober- und Unterklassen Beispiel: Person p = new Person (“Meier“, “Jana“, “Dortmund“); Kunde k = new Kunde (“Schmidt“, “Axel“, “Bochum“, 103); // Methoden in beiden Klassen vereinbart System.out.println(p.toString()); System.out.println(k.toString()); // Methode aus Person vererbt System.out.println(p.gibOrt()); System.out.println(k.gibOrt()); // Methode nur in Kunde k.aendereOrt(103, “Unna“);

Referenzen auf Ober- und Unterklassen Beispiel: Person p = new Person (“Meier“, “Jana“, “Dortmund“); Kunde k = new Kunde (“Schmidt“, “Axel“, “Bochum“, 103); // Methoden in beiden Klassen vereinbart System.out.println(p.toString()); System.out.println(k.toString()); // Methode aus Person vererbt System.out.println(p.gibOrt()); System.out.println(k.gibOrt()); // Methode nur in Kunde k.aendereOrt(103, “Unna“); p a k

Referenzen auf Ober- und Unterklassen Folgerung: Da jede öffentliche Methode der Oberklasse auch von jeder Unterklasse bereitgestellt wird, darf eine Referenz der Oberklasse auf Objekte einer Unterklasse verweisen.

Referenzen auf Ober- und Unterklassen Beispiel: Person p = new Person (“Meier“, “Jana“, “Dortmund“); Kunde k = new Kunde (“Schmidt“, “Axel“, “Bochum“, 103); p = k; p.aendereOrt(103, “Unna“); System.out.println(p.gibOrt()); System.out.println(p.toString());

Referenzen auf Ober- und Unterklassen Beispiel: Person p = new Person (“Meier“, “Jana“, “Dortmund“); Kunde k = new Kunde (“Schmidt“, “Axel“, “Bochum“, 103); p = k; p.aendereOrt(103, “Unna“); System.out.println(p.gibOrt()); System.out.println(p.toString()); Nicht möglich, da p Referenz auf Person und aendereOrt in Person unbekannt ist.

Referenzen auf Ober- und Unterklassen Beispiel: Person p = new Person (“Meier“, “Jana“, “Dortmund“); Kunde k = new Kunde (“Schmidt“, “Axel“, “Bochum“, 103); p = k; p.aendereOrt(103, “Unna“); System.out.println(p.gibOrt()); System.out.println(p.toString()); Nicht möglich, da p Referenz auf Person und aendereOrt in Person unbekannt ist.

Referenzen auf Ober- und Unterklassen Beispiel: Person p = new Person (“Meier“, “Jana“, “Dortmund“); Kunde k = new Kunde (“Schmidt“, “Axel“, “Bochum“, 103); p = k; p.aendereOrt(103, “Unna“); System.out.println(p.gibOrt()); System.out.println(p.toString()); Unproblematisch, da in Person definiert und in Kunde nur geerbt.

Referenzen auf Ober- und Unterklassen Beispiel: Person p = new Person (“Meier“, “Jana“, “Dortmund“); Kunde k = new Kunde (“Schmidt“, “Axel“, “Bochum“, 103); p = k; p.aendereOrt(103, “Unna“); System.out.println(p.gibOrt()); System.out.println(p.toString()); In Person definiert und in Kunde geerbt und überdefiniert, so dass zwei Versionen von toString() bereit stehen. Welche Version wird ausgeführt?

Referenzen auf Ober- und Unterklassen Beispiel: Person p = new Person (“Meier“, “Jana“, “Dortmund“); Kunde k = new Kunde (“Schmidt“, “Axel“, “Bochum“, 103); p = k; p.aendereOrt(103, “Unna“); System.out.println(p.gibOrt()); System.out.println(p.toString()); Welche Version wird ausgeführt? Das Objekt entscheidet, nicht die Referenz: Da hier ein Kunde-Objekt, wird toString() aus Kunde aufgerufen.

Vererbung Person Kunde Aufruf einer Methode

Referenzen auf Ober- und Unterklassen Zusammenfassung: Der Typ der Referenz bestimmt, welche Methoden über diese Referenz überhaupt aufgerufen werden dürfen. Wenn eine Methode über eine Referenz aufgerufen werden kann, dann wird immer die in oder am nächsten vor der Klasse des Objekts definierte Version ausgeführt.

Referenzen auf Ober- und Unterklassen Zusammenfassung: Der Typ der Referenz bestimmt, welche Methoden über diese Referenz überhaupt aufgerufen werden dürfen. Wenn eine Methode über eine Referenz aufgerufen werden kann, dann wird immer die in oder am nächsten vor der Klasse des Objekts definierte Version ausgeführt. Polymorphie

Referenzen auf Ober- und Unterklassen Beispiel – es geht auch wieder zurück: Person p = new Person (“Meier“, “Jana“, “Dortmund“); Kunde k = new Kunde (“Schmidt“, “Axel“, “Bochum“, 103); p = k; System.out.println(p.gibOrt()); System.out.println(p.toString()); k = (Kunde)p; expliziter Type-Cast: Der Programmierer versichert dem Programm, dass p auf ein Objekt der Klasse Kunde verweist.

Referenzen auf Ober- und Unterklassen Wofür das Ganze?

Referenzen auf Ober- und Unterklassen Wofür das ganze Referenzierungskonzept? Es lassen sich Algorithmen formulieren, die nicht wissen müssen, mit welcher Art von Unterklassen-Objekten sie bei der Ausführung tatsächlich umgehen. Beispiel: Liste, die nicht weiß, ob int-Werte oder Kunden-Objekte aufgelistet werden.

Referenzen auf Ober- und Unterklassen Wofür das ganze Referenzierungskonzept? Es lassen sich Algorithmen formulieren, die nicht wissen müssen, mit welcher Art von Unterklassen-Objekten sie bei der Ausführung tatsächlich umgehen. Und: Objekte verschiedener Klassen können gemeinsam verarbeitet werden. Beispiel: Objekte der Klassen Kunde und Lieferant bei Weihnachtsgrüßen.

Referenzen auf Ober- und Unterklassen Beispiel: public class Lieferant extends Person { … }

Referenzen auf Ober- und Unterklassen Beispiel: public class Lieferant extends Person { … } Lieferant ist eine weitere Unterklasse von Person.

Unterklassen von Unterklassen Beispiel: public class Goldkunde extends Kunde { private String geschenk; … }

Unterklassen von Unterklassen Beispiel: public class Goldkunde extends Kunde { private String geschenk; … } Goldkunde ist jetzt: (direkte) Unterklasse von Kunde und zugleich eine weitere Unterklasse von Person

Klassenhierarchie Person Kunde Lieferant Goldkunde

Anmerkungen zum Vererbungskonzept Jede Klasse hat höchstens eine Oberklasse: public class Goldkunde extends Kunde { private String geschenk; … } (Die Syntax erlaubt hier keine Liste!)

Anmerkungen zum Vererbungskonzept Jede Klasse hat höchstens eine Oberklasse: public class Goldkunde extends Kunde { private String geschenk; … } (Die Syntax erlaubt hier keine Liste!) Es entstehen immer Vererbungsbäume!

Anmerkungen zum Vererbungskonzept Jede selbst definierte Klasse hat eine explizite Oberklasse oder die implizite Oberklasse Object: public class Person extends Object { … }

Anmerkungen zur Syntax Jede selbst definierte Klasse hat eine explizite Oberklasse oder die implizite Oberklasse Object: public class Person extends Object { … } Alle Klassen bilden einen Vererbungsbaum mit der Wurzel Object!

Anmerkungen zum Vererbungskonzept Jede selbst definierte Klasse hat eine explizite Oberklasse oder die implizite Oberklasse Object: public class Person extends Object { … } Alle Klassen bilden einen Vererbungsbaum mit der Wurzel Object! Referenzen der Klasse Object können auf jedes Objekt verweisen.

Klassenhierarchie Object Person Kunde Lieferant Goldkunde