Software Entwicklung 1

Ähnliche Dokumente
Einstieg in die Informatik mit Java

Kapitel 6. Vererbung

Kapitel 6. Vererbung

3 Objektorientierte Konzepte in Java

Programmieren I. Kapitel 8. Vererbung

Kapitel 6. Vererbung

Grundzüge der Programmierung. Wiederverwendung VERERBUNG

Programmieren in Java

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

Javakurs FSS Lehrstuhl Stuckenschmidt. Tag 3 - Objektorientierung

Repetitorium Informatik (Java)

Java Schulung (Java 2 Java Development Kit 5 / 6)

Vorlesung Programmieren. Bisher: Klassen und Objekte. Was ist mit ähnlichen Klassen? Vererbung und Polymorphismus

Programmieren in Java

Java Einführung Abstrakte Klassen und Interfaces

Java Einführung Methoden in Klassen

Kapitel 9: Klassen und höhere Datentypen. Klassen und höhere. Objekte, Felder, Methoden. Küchlin/Weber: Einführung in die Informatik

Einführung in die Programmierung

3 Objektorientierte Konzepte in Java

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

Java I Vorlesung Vererbung und Sichtbarkeit

Java Vererbung. Inhalt

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

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

5.6 Vererbung. Vererbung

Inhaltsüberblick. I. Grundbegriffe - Objekte und Klassen. Organisatorisches. I. Grundbegriffe - Objektorientierte Konzepte

Objektorientierte Programmierung. Kapitel 12: Interfaces

Angewandte Mathematik und Programmierung

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

5. Abstrakte Klassen

5.5.8 Öffentliche und private Eigenschaften

Überschreiben von Methoden

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

Einführung in die Informatik

GetName(), GetName(), GetGeschlecht() und AelterWerden().

Algorithmen und Datenstrukturen 07

Teil 2: OOP und JAVA (Vorlesung 11)

Abschnitt 9: Schnittstellen: Interfaces

Javakurs für Anfänger

3. Konzepte der objektorientierten Programmierung

Vererbung & Schnittstellen in C#

Programmierkurs Java. Vererbung. Prof. Dr. Stefan Fischer Institut für Telematik, Universität zu Lübeck

Grundlagen der Objektorientierung

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

Probeklausur: Programmierung WS04/05

7. Schnittstellen Grundlagen zu Schnittstellen. 7. Schnittstellen

Vererbung. Martin Wirsing. Ziele. Vererbung

Klassenbeziehungen & Vererbung

Kapitel 8. Programmierkurs. Methoden. 8.1 Methoden

Letztes Mal. static int ggt(int a, int b) { if (a == b) return a; else if (a > b) return ggt(a-b,b); else if (a < b) return ggt(a,b-a);

Probeklausur: Programmierung WS04/05

B Java RMI B.2 B.4. 1 Java. 1.2 Methoden. 1.1 Objekte (2) 1.1 Objekte. Objektorientierte Sprache. Klassenbeschreibung. Methode ist eine Art Funktion

Java Einführung Klassendefinitionen

Institut fu r Informatik

Interfaces und Vererbung

JAVA - Methoden

11.3 Virtuelle Methoden

Präsentation Interfaces

Prüfungszeuch im Fach Objektorientierte Programmierung WS 2000

Klassen in Java. Klassen

Vererbung. Was versteht man unter dem Begriff Vererbung?

Algorithmen und Programmierung II

Faustregeln zu Zusicherungen

Informatik II Prüfungsvorbereitungskurs

Objektorientierte Programmierung

Klassen mit Instanzmethoden

Javakurs 2013 Objektorientierung

Java für Computerlinguisten

Theorie zu Übung 8 Implementierung in Java

SWE1 / Übung 9 ( )

JAVA - Methoden - Rekursion

2. Vererbung und Polymorphie. Vererbung (1/2) Beispiel (1/2) Vererbung (2/2) Eine Unterklasse wird folgendermaßen definiert

Prinzipien Objektorientierter Programmierung

1. Typen und Literale (6 Punkte) 2. Zuweisungen (6 = Punkte)

Informatik II Übung 6 Gruppe 7

Vererbung, Polymorphismus

Repetitorium Informatik (Java)

AuD-Tafelübung T-B5b

Objektorientierung: Klassen und Objekte

Algorithmen und Datenstrukturen

Innere Klassen in Java

Typumwandlungen bei Referenztypen

Informationsverarbeitung im Bauwesen

Computeranwendung und Programmierung (CuP)

Eine Klasse beschreibt Objekte mit gleichen Attributen und Methoden.

Objektorientierte Programmierung. Kapitel 16: Pakete, Zugriffsschutz

Programmierkurs Java

Java, OO und UML Fortsetzung

2.4.3 Polymorphie (Wiederholung von Alp2)

Objekt-Orientierte Programmierung

PIWIN I. Praktische Informatik für Wirtschaftsmathematiker, Ingenieure und Naturwissenschaftler I. Vorlesung 3 SWS WS 2008/2009

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

Klassen und Objekte. Einführung in Java. Folie 1 von Mai Ivo Kronenberg

Angewandte Mathematik und Programmierung

Kapitel 2. Java: Der Einstieg. 2.1 Grundlegendes zu Java Historisches Eigenschaften von Java

EINI WiMa/LW. Einführung in die Informatik für Naturwissenschaftler und Ingenieure. Vorlesung 2 SWS WS 11/12

1 Polymorphie (Vielgestaltigkeit)

Der Operator this. Wir betrachten nochmals die Klassendefinition von Ballon.

EINI I. Einführung in die Informatik für Naturwissenschaftler und Ingenieure. Vorlesung 2 SWS WS 10/11

Transkript:

Software Entwicklung 1 Annette Bieniusa / Arnd Poetzsch-Heffter AG Softech FB Informatik TU Kaiserslautern

Vererbung Bieniusa/Poetzsch-Heffter Software Entwicklung 1 2/ 47

Abstraktionen auf Klassenebene Abstraktion bezeichnet die Verallgemeinerung des konkreten Einzelfalls, wobei generelle Strukturmerkmale betont werden. In der objekt-orientierten Software-Entwicklung: Extraktion der gemeinsamen Eigenschaften unterschiedlicher Objekte / Klasse Vermeiden von Duplikation (weniger Code weniger Arbeit) Beispiele: Personen in der Universität (Professoren, Studierende, Verwaltungsangestellte,...) Komponenten von Fenstersystemen (Menues, Schaltflächen, Textfelder,...) Ein-/Ausgabeschnittstellen (Dateien, Netze,...) Bieniusa/Poetzsch-Heffter Software Entwicklung 1 3/ 47

Vorgehen 1 Auffinden von Programmfragmenten (Attribute und Methoden) mit ähnlicher Bedeutung / Struktur 2 Erarbeiten einer abstrakteren Klasse, die die gemeinsamen Eigenschaften zusammenfasst und eine entsprechende (verkleinerte) Schnittstelle bereitstellt Bieniusa/Poetzsch-Heffter Software Entwicklung 1 4/ 47

Fallstudie: Geometrische Figuren In einem Zeichenprogramm sollen verschiedene geometrische Figuren in einem Koordinatensystem dargestellt werden (Einheit: ein Pixel). Wir betrachten zunächst drei Arten von Figuren: Kreise mit dem Mittelpunkt als Referenzpunkt und gegebenem Radius Quadrate mit Referenzpunkt links oben und gegebener Seitenlänge Punkte, die nur durch den Referenzpunkt gegeben sind Bieniusa/Poetzsch-Heffter Software Entwicklung 1 5/ 47

Modell <<interface>> Figure disttoorigin() : double area() : double Circle loc : CartPt radius : double getradius() : double Square loc : CartPt size : double getsize() : double Dot loc : CartPt x,y : double CartPt disttoorigin() : double Bieniusa/Poetzsch-Heffter Software Entwicklung 1 6/ 47

Geometrische Figuren: Interfaces // Interface fuer Geometrische Figuren interface Figure { double disttoorigin (); double area (); Bieniusa/Poetzsch-Heffter Software Entwicklung 1 7/ 47

Geometrische Figuren: Referenzpunkt // Punkt im zweidimensionalen kartesischen Koordinatensystem class CartPt { private double x, y; CartPt ( double x, double y) { this.x = x; this.y = y; double disttoorigin () { return Math. sqrt (x * x + y * y); Bieniusa/Poetzsch-Heffter Software Entwicklung 1 8/ 47

Geometrische Figur: Kreis class Circle implements Figure { private CartPt loc ; private double radius ; Circle ( CartPt loc, double radius ) { this. loc = loc ; this. radius = radius ; double area () { return radius * radius * Math. PI; double disttoorigin () { return Math. max ( loc. disttoorigin () - radius,0) ; double getradius () { return radius ; Bieniusa/Poetzsch-Heffter Software Entwicklung 1 9/ 47

Geometrische Figur: Quadrat class Square implements Figure { private CartPt loc ; privat double size ; Square ( CartPt loc, double size ) { this. loc = loc ; this. size = size ; double area () { return size * size ; // Referenzpunkt ist linke untere Ecke double disttoorigin () { return loc. disttoorigin (); double getsize () { return size ; Bieniusa/Poetzsch-Heffter Software Entwicklung 1 10/ 47

Geometrische Figur: Punkt class Dot implements Figure { private CartPt loc ; Dot ( CartPt loc ) { this. loc = loc ; double area () { return 0; double disttoorigin () { return loc. disttoorigin (); Bieniusa/Poetzsch-Heffter Software Entwicklung 1 11/ 47

Ähnlichkeiten zwischen Klassen <<interface>> Figure disttoorigin() : double area() : double Circle loc : CartPt radius : double getradius() : double Square loc : CartPt size : double getsize() : double Dot loc : CartPt Bieniusa/Poetzsch-Heffter Software Entwicklung 1 12/ 47

Ähnlichkeiten zwischen Klassen loc : CartPt AFigure Circle radius : double getradius() : double Square size : double getsize() : double Dot Bieniusa/Poetzsch-Heffter Software Entwicklung 1 13/ 47

Begriffsklärung: Vererbung Vererbung (engl. inheritance) im engeren Sinne bedeutet, dass eine Klasse Programmteile von einer anderen übernimmt. Die erbende Klasse heißt Subklasse, die vererbende Klasse heißt Superklasse. In Java sind die ererbten Programmteile Attribute, Methoden und geschachtelte Klassen, nicht vererbt werden Klassenattribute, Klassenmethoden und Konstruktoren. Bieniusa/Poetzsch-Heffter Software Entwicklung 1 14/ 47

Spezialisierung Spezialisierung bedeutet das Hinzufügen speziellerer Eigenschaften zu einem Gegenstand oder das Verfeinern eines Begriffs durch Einführen weiterer Merkmale (z.b. berufliche Spezialisierung). Vererbung unterstützt Spezialisierung durch: Hinzufügen von Attributen (Zustandserweiterung) Hinzufügen von Methoden (Erweiterung der Funktionalität) Anpassen, Erweitern bzw. Reimplementieren von Supertyp-Methoden (Anpassen der Funktionalität) Bieniusa/Poetzsch-Heffter Software Entwicklung 1 15/ 47

Vererbung von Attributen I class AFigure { protected CartPt loc ; AFigure ( CartPt loc ) { this. loc = loc ; class Dot extends AFigure {... class Square extends AFigure {... class Circle extends AFigure {... Konstruktor der AFigure-Klasse enthält und initialisiert nur das loc-attribut Square-Objekte haben zusätzlich ein size-attribut Wie werden die Felder initialisiert? Bieniusa/Poetzsch-Heffter Software Entwicklung 1 16/ 47

Vererbung von Attributen II class Dot extends AFigure { Dot ( CartPt loc ) { super ( loc );... class Square extends AFigure { private double size ; Square ( CartPt loc, double size ) { super ( loc ); this. size = size ;... class Circle extends AFigure { private double radius ; Circle ( CartPt loc, double radius ) { super ( loc ); this. radius = radius ;... Bieniusa/Poetzsch-Heffter Software Entwicklung 1 17/ 47

Vererbung von Attributen III Der Aufruf super(...) ruft den Konstruktor der Superklasse auf. Er muss zu Beginn des Konstruktors der Subklasse verwendet werden. Andernfalls wird zu Beginn der Defaultkonstruktor der Superklasse aufgerufen. Konstruktoren werden in Java nicht vererbt. Bieniusa/Poetzsch-Heffter Software Entwicklung 1 18/ 47

Vererbung von Methoden I class Dot extends AFigure {... double area () { return 0; double disttoorigin () { return loc. disttoorigin (); class Circle extends AFigure {... private double radius ; double area () { return radius * radius * Math. PI; double disttoorigin () { return loc. disttoorigin () - radius ; class Square extends AFigure {... private double size ; double area () { return size * size ; double disttoorigin () { return loc. disttoorigin (); Bieniusa/Poetzsch-Heffter Software Entwicklung 1 19/ 47

Vererbung von Methoden II Methodendefinitionen können genauso vererbt werden wie Attribute Sinnvoll, wenn die Definition einer Methode für alle Subklassen identisch ist Problem: disttoorigin() ist in Circle anders definiert! Bieniusa/Poetzsch-Heffter Software Entwicklung 1 20/ 47

Überschreiben In vielen Fällen ist es nötig, die Implementierung einer Methode der Superklasse in der Subklasse anzupassen, insbesondere um den erweiterten Zustand mit zu berücksichtigen. Überschreiben (engl. overriding) einer ererbten Methode m der Superklasse bedeutet, dass man in der Subklasse eine neue, eigene Deklaration für m angibt. Die überschreibende Methode muss in Java die gleiche Signatur wie die überschriebene haben und mindestens so zugreifbar sein. Die überschriebene Methode muss zugreifbar sein und kann durch super - Aufrufe benutzt werden: super.<methodenname>( <AktParam1>,...) Der aktuelle implizite Parameter eines super-aufrufs ist der aktuelle implizite Parameter der aufrufenden Methode. Bieniusa/Poetzsch-Heffter Software Entwicklung 1 21/ 47

Beispiel: Überschreiben class AFigure {... double disttoorigin () { return loc. disttoorigin (); // Klassen Dot und Square enthalten keine eigene Definition dieser Methode!! class Circle {... double disttoorigin () { return super. disttoorigin () - radius ; Der Aufruf von loc.disttoorigin() wäre die einzige Abhängigkeit von CartPt in der Circle-Klasse. Wir eliminieren diese Abhängigkeit durch Rückgriff auf die Implementierung der Superklasse. Bieniusa/Poetzsch-Heffter Software Entwicklung 1 22/ 47

Beispiel: Wetterdaten In einem Programm zur Erfassung von Wetterdaten werden Messungen von Temperatur und Luftdruck verwaltet. Für jeden Tag werden Minimal- und Maximalwerte der jeweiligen Messung gespeichert. Temperature high, low : double date : Date gethigh() : double getlow() : double asstring() : String Pressure high, low : double date : Date gethigh() : double getlow() : double asstring() : String Bieniusa/Poetzsch-Heffter Software Entwicklung 1 23/ 47

Aufgabe Vermeiden Sie Code Duplikation durch Vererbung! // Temperaturmessungen // [in Celsius ] class Temperature { private Date date ; private int high ; private int low ; Temperature ( int high, int low, Date date ) {... int gethigh () { return high ; int getlow () { return low ; // Dr uckmess ungen // [in hpa ] class Pressure { private Date date ; private int high ; private int low ; Pressure ( int high, int low, Date date ) {... int gethigh () { return high ; int getlow () { return low ; String asstring () { return date + " : " + low + "-" + high + "C"); String asstring () { return date + " : " + low + "-" + high + " hpa "); Bieniusa/Poetzsch-Heffter Software Entwicklung 1 24/ 47

Klasse Recording // Messungen class Recording { protected Date date ; protected int high ; protected int low ; Recording ( int high, int low, Date date ) { this. high = high ; this. low = low ; this. date = date ; int gethigh () { return high ; int getlow () { return low ; String asstring () { return date + " : " + low + "-" + high );// ohne Einheit Bieniusa/Poetzsch-Heffter Software Entwicklung 1 25/ 47

Klassen Pressure und Recording class Pressure extends Recording { Pressure ( int high, int low, Date date ) { super (high, low, date ); String asstring () { return super. asstring () + " hpa "; class Temperature extends Recording { Temperature ( int high, int low, Date date ) { super (high, low, date ); String asstring () { return super. asstring () + "C"; Bieniusa/Poetzsch-Heffter Software Entwicklung 1 26/ 47

Vererbung und Information Hiding Durch die Vererbung gibt es nun zwei Arten, eine Klasse K zu nutzen: Anwendungsnutzung: Erzeugen und Verwenden der Objekt von K Vererbungsnutzung: Spezialisieren und Erben von K Damit die erbende Klasse die geerbten Programmteile geeignet nutzen kann, benötigt sie meist einen intimeren Zugriff als ein Anwendungsnutzer. Bieniusa/Poetzsch-Heffter Software Entwicklung 1 27/ 47

Geschützter Zugriff Viele Programmiersprachen bieten einen gesonderten Zugriffsbereich für Vererbung, der alle Subklassen einer Klasse umfasst. Programmelemente, die als geschützt deklariert sind, d.h. mit dem Modifikator protected, sind in allen Subklassen zugreifbar. Will man also Programmelemente, insbesondere Attribute, für Subklassen bereitstellen, müssen sie mindestens geschützten Zugriff gewähren. Geschützter Zugriff ermöglicht allerdings erhebliches Verändern einer Klasse in Subklassen und birgt dementsprechend auch Gefahren, wie folgendes Beispiel zeigt. Bieniusa/Poetzsch-Heffter Software Entwicklung 1 28/ 47

Beispiel: Geschütztes Zugriffsrecht I public class A_nicht_Null { protected int a = 1; public int geta () { return a; protected void seta ( int i) { if (i > 0) { a = i; public class B {... public void m( A_nicht_Null obj ) { float f = 7 / obj. geta (); Bieniusa/Poetzsch-Heffter Software Entwicklung 1 29/ 47

Beispiel: Geschütztes Zugriffsrecht II Angesichts der Klasse A_nicht_Null kann die Anwendung davon ausgehen, dass die Instanzvariable a nie den Wert 0 annimmt. Durch Vererbung können Subtyp-Objekte erzeugt werden, die sich ganz anders als die Objekte der Superklasse verhalten: public class A_doch_Null extends A_nicht_Null { public int geta () { return -a; public void seta ( int i) { a = i; Bieniusa/Poetzsch-Heffter Software Entwicklung 1 30/ 47

Beispiel: Geschütztes Zugriffsrecht III public class Main { public static void main ( String [] args ) { A_doch_Null adn = new A_doch_Null (); adn. seta (0) ; A_nicht_Null ann = adn ;... // hier koennte die Herkunft von ann // verschleiert sein new B().m( ann ); Um Szenarien wie im obigen Beispiel zu vermeiden, sollten Subklassen-Objekte das Verhalten der Superklassen-Objekte spezialisieren und sich ansonsten konform verhalten. Bieniusa/Poetzsch-Heffter Software Entwicklung 1 31/ 47

Zugreifbarkeit von vererbten Attributen class C { public int a = 0; protected int b = 1; private int c = 2; int getc () { return c; class D extends C { int getb () { return b; public class Attributvererbung { public static void main ( String [] args ) { D d = new D(); System. out. println (" Attribut a: " + d.a); System. out. println (" Attribut b: " + d. getb ()); System. out. println (" Attribut c: " + d. getc ()); Bieniusa/Poetzsch-Heffter Software Entwicklung 1 32/ 47

Verschattung von vererbten Attributen I class C { public int a = 0; public int b = 2; private int c = 3; int getc () { return c; class D extends C { public int e = 10; public int b = 12; public class Zustandserweiterung { public static void main ( String [] args ) { D d = new D(); System. out. println (" Attribut e: " + d.e); // deklariertes e System. out. println (" Attribut b: " + d.b); // deklariertes c System. out. println (" Attribut a: " + d.a); // ererbtes a System. out. println (" Attribut b: " + ((C) d).b); // ererbtes b System. out. println (" Attribut c: " + d. getc ()); // ererbtes c Bieniusa/Poetzsch-Heffter Software Entwicklung 1 33/ 47

Verschattung von vererbten Attributen II Attribute können ererbte Attribute gleichen Namens verschatten. Dies sollte vermieden werden, kann aber nicht ausgeschlossen werden. Attribute werden statisch gebunden. Maßgebend ist also der (statische) Typ des selektierten Ausdrucks und nicht der Typ des Objekts, dass sich bei Auswertung des Ausdrucks ergibt. Verwenden Sie im Java-Visualizer die Option Show overridden fields, um alle (auch die verschatteten) Attribute zu visualisieren. Bieniusa/Poetzsch-Heffter Software Entwicklung 1 34/ 47

Beispiel: Geometrische Figuren I Für geometrische Figuren haben wir bisher: interface Figure { double area (); double disttoorigin (); class AFigure { protected CartPt loc ; AFigure ( CartPt loc ) {... double disttoorigin () {... class Dot extends AFigure { Dot ( CartPt loc ) {... double area () {... class Circle extends AFigure { Circle ( CartPt loc, double radius ) {... double area () {... double disttoorigin () {... double getradius () {...... Bieniusa/Poetzsch-Heffter Software Entwicklung 1 35/ 47

Beispiel: Geometrische Figuren II <<interface>> Figure disttoorigin() : double area() : double loc : CartPt AFigure Circle radius : double getradius() : double Square size : double getsize() : double Dot Bieniusa/Poetzsch-Heffter Software Entwicklung 1 36/ 47

Beispiel: Geometrische Figuren III Wenn AFigure das Interface Figure implementieren soll, dann müssen alle Methoden, die Figure verlangt, auch in AFigure definiert werden. Problem: Es ist unklar, wie z.b. area() allgemein definiert werden soll, da jede geometrische Figur diese Methode anders definiert. Bieniusa/Poetzsch-Heffter Software Entwicklung 1 37/ 47

Begriffsklärung: Abstrakte Methoden & Klassen Eine Methode heißt abstrakt, wenn für sie kein Rumpf angegeben ist. Eine Klasse heißt abstrakt, wenn sie abstrakte Methoden besitzt oder als abstrakt deklariert ist (Modifikator abstract). Es ist unzulässig, Instanzen abstrakter Klassen zu erzeugen. Bieniusa/Poetzsch-Heffter Software Entwicklung 1 38/ 47

Beispiel: Abstrakte AFigure-Klasse I abstract class AFigure implements Figure { protected CartPt loc ; AFigure ( CartPt loc ) {... double disttoorigin () {... abstract double area (); Bieniusa/Poetzsch-Heffter Software Entwicklung 1 39/ 47

Modell <<interface>> Figure disttoorigin() : double area() : double <<abstract>> AFigure loc : CartPt Circle radius : double getradius() : double Square size : double getsize() : double Dot Bieniusa/Poetzsch-Heffter Software Entwicklung 1 40/ 47

Spezialisierung durch die Subklasse In der zuvor gezeigten Version der Wetterdaten kann ein Programmierer direkt Objekte von Recording ableiten. Um dies zu verhindern, wandeln wir die Klasse Recording in eine abstrakte Klasse um. Ausserdem fügen wir eine abstrakte Methode hinzu, die eine String-Repräsentation der Messeinheit liefert. Template-and-Hook Muster: Das Template gibt die grundsätzliche Funktionalität vor und sieht Erweiterungspunkte (Hooks) vor, an denen Subklassen erforderliche Erweiterungen anbringen. Abstrakte Hook-Methoden zwingen die Subklassen die Erweiterungen durchzuführen. Bieniusa/Poetzsch-Heffter Software Entwicklung 1 41/ 47

Beispiel: Wetterdaten // Messungen abstract class Recording { protected Date date ; protected int high ; protected int low ; Recording ( int high, int low, Date date ) { this. high = high ; this. low = low ; this. date = date ; int gethigh () { return high ; int getlow () { return low ; String asstring () { return date + " : " + low + "-" + high + unit (); abstract String unit (); Bieniusa/Poetzsch-Heffter Software Entwicklung 1 42/ 47

Klassen Pressure und Recording class Pressure extends Recording { Pressure ( int high, int low, Date date ) { super (high, low, date ); String unit () { return " hpa "; class Temperature extends Recording { Temperature ( int high, int low, Date date ) { super (high, low, date ); String unit () { return "C"; Bieniusa/Poetzsch-Heffter Software Entwicklung 1 43/ 47

Dynamische Methodenauswahl bei Vererbung Der dynamische Typ eines Objekts entspricht dem Klassentyp der Klasse, die bei der Erzeugung des Objektes angegeben wurde. <Ausdruck >. < methodenname >( <AktParam1 >,...) ; Beim Methodenaufruf wird die Implementierung der Methode basierend auf dem dynamischen Typs des <Ausdruck>s ausgewählt. Ist eine solche Implementierung in der Klasse des dynamischen Typs nicht vorhanden, wird die Implementierung jener Klasse gewählt, die in der Vererbungshierarchie am weitesten unten liegt (d. h. die von der Vererbung her am nächsten ist). Bieniusa/Poetzsch-Heffter Software Entwicklung 1 44/ 47

Beispiele: Dynamische Methodenauswahl 1 Auswahl zwischen Methode der Super- und Subklasse: AFigure c = new Circle ( new CartPt (4.0,4.0), 1.0) ;... c. disttoorigin (); 2 Auswahl zwischen Methoden verschiedener Subklassen: void getmaxarea ( Figure [] df) { double maxarea = 0.0; for ( int i = 0; i < df. length ; i ++) { Math. max ( maxarea, df[i]. area ()); return maxarea ; Bieniusa/Poetzsch-Heffter Software Entwicklung 1 45/ 47

Zusammenfassung I Syntax der Klassendeklaration: < Modifikatiorenlist > class < Klassenname > [ extends < Klassenname > ] [ implements <Liste von Schnittstellennamen > ] { < Liste von Attribut -, Konstruktor -, Methodendeklaration > Eine Klassen erweitert eine direkte Superklasse und implementiert ggf. mehrere Schnittstellentypen. Der Entwurf geeigneter Klassenhierarchien ist ein zentraler Aspekt des objektorientierten Modellierung. Dabei sind Abstraktion und Spezialisierung sinnvoll zu kombinieren. Bieniusa/Poetzsch-Heffter Software Entwicklung 1 46/ 47

Zusammenfassung II Abstraktion/Generalisierung erlaubt es, Klassen zu deklarieren, die die relevante Gemeinsamkeiten einer Gruppe von Klassen ausdrücken. Spezialisierung erlaubt es, Klassen zu deklarieren, die die Funktionalität existierender Klassen erweitern. Vererbung bietet hierzu ein mächtiges Sprachkonzept: Statt Elemente explizit von der Super- in die Subklassen zu kopieren, steht die vererbten Elemente automatisch in der Subklasse bereit. Vererbung ist transitiv. Bieniusa/Poetzsch-Heffter Software Entwicklung 1 47/ 47