Vererbung, Polymorphismus INE2 M. Thaler, tham@zhaw.ch Office TG208 http://www.zhaw.ch/~tham 1
Um was geht es? Automobilbau Firma produziert Limousine Kunde möchte Kombi Wielösen? Möglichkeiten Neudesign von Grund auf möglichst viel übernehmen Limusine ist schon modular entwickelt - Umwandlung zu Kombi einfach 2
... um was geht es? Lösung Autokonzern entwickelt Grundplattform Auf Plattform verschiedene Marken und Modelle Individualisierung unterschiedliche Ausrüstung Erweiterungen unterschiedliche Motorisierung Anpassungen etc. Vorteile Enwicklungskosten besser amortisieren neue Modelle schneller marktreif 3
... um was geht es? Ziele Software-Entwicklung möglichst aus bestehenden Bausteinen (Klassen) aufbauen bei Bedarf Bausteine an spezifische Anforderungen anpassen Anpassen von Software modifizieren erweitern Lösung1 Anpassenin Quelle oft schwierig: Quelle umfangreich, nicht verfügbar, Einfluss auf bestehende Anwendungen, etc. Lösung2 OOP verwendete Software-Bausteine belassen wie sie sind Ergänzungen und Änderungen durch Vererbung und Erweiterung 4
... um was geht es? Objektorientierte Programmierung ermöglicht Anpassung von Quellen ohne Quellen zu haben Open-Closed Prinzip Software-Einheiten - offen für Erweiterungen - geschlossen für Modifikationen bestehende Bausteine nicht verändern Modifikation der Funktionalität über Erweiterung OOP Mechanismus für Erweiterung und Anpassung Vererbung 5
Lernziele Siekönnen erklären um was es bei der Vererbung geht Vererbung in einfachen Applikationen anwenden die Begriffe "übeschreiben" und "überladen" erklären und diskutieren für die Vererbung wichtige Zugriffsmodifikatoren aufzählen und diskutieren die Klassenhierarchie und Casting erklären und richtig anwenden erklären, wie Konstruktoren in der Klassenhierarchie aufgerufen werden bzw. aufgerufen werden müssen "final" im Zusammenhang mit Vererbung erklären und anwenden den Begriff "Polymorphismus" erklären 6
Inhalt Vererbung: Erweiterung/ Anpassung Zugriffsmodifikatoren Vererbungshierarchie Konstruktoren Finale Klassen, Methoden und Attribute Polymorphismus 7
Entwurfsgrundsatz Vererbung nur verwenden, wenn "ist ein"-beziehung vorhanden Beispiel - i.o. Billard-Kugel ist eine Kugel - aber Billard-Kugel ist kein Ballon 8
Vererbung Erweiterung Zwei Klassen: Kugel und Ballon Kugel fixer Radius Ballon gleich wie Kugel aber veränderbarer Radius Klasse Ballon erweitert Klasse Kugel Klasse Ballon ist von Klasse Kugel abgeleitet Terminologie Klasse Kugel Oberklasse(superclass) von Klasse Ballon Klasse Ballon Unterklasse(subclass) von Klasse Kugel Kugel superclass, Oberklasse, Basisklasse Zeichen für Vererbung Ballon subclass, Unterklasse, abgeleitete Klasse 9
Vererbung in Java: extends KlasseBallonerbtvon Kugel public class Kugel { protected int x, y, r = 10; public Kugel(int x, int y) { this.x = x; this.y = y; public void draw(graphics g) { g.filloval(...); public class Ballon extends Kugel { public Ballon(int x, int y) {... public void changeradius(int deltar) { r += deltar; 10
Vererbung Erweiterung Klasse Ballon erbt von Klasse Kugel Attribute (Instanz- und Klassenvariablen) Methoden (Operationen) Attribute und Methoden von Klasse Kugel - in Klasse Ballon zugreifbar Java Einfachvererbung es kann nur von einer Klasse geerbt werden C++ unterstützt Mehrfachvererbung Kugel Kugel Ballon Methoden Ballon 11
... Vererbung Erweiterung Unterklasse erhält keine Kopie der Variablen und Methoden der Oberklasse erhält Zugriff auf Variablen und Methoden der Oberklasse kann zusätzliche Instanzvariablen und Methoden deklarieren Achtung - jedes Objekte besitzt eine eigene Kopien der Instanzvariablen von Ober- und Unterklasse Allgemeine Deklaration einer Unterklasse class Subclass extends Superclass { Instanzvariablen-Deklaration Konstruktor-Deklarationen Methoden-Deklarationen 12
Vererbung Anpassung Zwei Klassen: Kugel und BillardKugel Kugel keine "Dekoration" BillardKugel gleich wie Kugel aber mit "Zahl" angezeigt - Methode draw() anpassen Methode draw() wird überschrieben draw() gleiche Signatur in Unterklasse wie in Oberklasse Kugel Kugel BillardKugel Methode BillardKugel 13
... Vererbung Anpassung Klasse BillardKugel überschreibt draw() public class Kugel { protected int x, y, r = 10; public Kugel(int x, int y) { this.x = x; this.y = y; public void draw(graphics g) { g.filloval(...); 14 public class BillardKugel extends Kugel { private int number; public BillardKugel(int x, int y, int n) {... number = n; @Override public void draw(graphic g) { g.filloval(...); g.drawstring(...);
Überschreiben von Methoden Methode in Unterklasse gleiche Signatur wie in Oberklasse Methode in Oberklasse wird überschrieben - d.h. Methode aus Unterklasse wird ausgeführt Ursprüngliche Methode in Oberklasse kann mit Objektname super aufgerufen werden - super aktuelles Objekt, aber als Objekt der Oberklasse interpretiert Beispiel 15 @Override public void draw(graphic g) { super.draw(g); // statt g.filloval(...); g.drawstring(...);
... Überschreiben von Methoden Vorsicht falls Signaturen nicht gleich Methode wird überladen in Unterklasse existieren nun beide Methoden Merke Überladen (overloading)!= Überschreiben (overriding) 16
Überschreiben von Attributen Überschreiben von Attributen Klasse Instanzvariable mit gleichem Namen wie in Oberklasse Instanzvariable aus Oberklasse in Unterklasse nicht mehr sichtbar - wird shadowing (Überschatten) genannt Möglichst vermeiden! führt oft zu Problemen 17
Zugriffsmodifikator protected Methoden/Instanzvariablen mit protected sind in allen Unterklassen sichtbar Übersicht Modifikator gleiche Klasse Unterklasse andere Klasse private ja nein nein protected ja ja nein public ja ja ja Grundsatz minimal mögliche/sinnvolle Sichtbarkeit wählen 18
Klassen-Vererbungshierarchie Vererbungs-Hierarchie Klasse ohne explizite Oberklasse - erbt implizit von Object jede Unterklasse kann erweitert werden baumartige Hierachie von Unterklassen sogenanntes Klassendiagramm Beispiel UML-Klassendiagramm 1) der Klasse Kugel 19 1) UML: unified modelling language
Casting up In Klassenhierarchie eine Referenz nach oben "casting up" "safe casting" unproblematisch Ballon meinballon = new Ballon(); Kugel meinekugel = meinballon; meinekugel.changeradius(...); meinballon meinekugel Objekt vom Typ Ballon 20
Casting down In Klassenhierarchie eine Referenz nach unten "casting down" unsafe casting expliziter Typecast notwendig Kugel meinekugel = new Ballon(); Ballon meinballon = (Ballon)meineKugel; Achtung: - meinekugel muss Ballon-Objekt sein - andernfalls ClassCastException meinekugel meinballon 21 Objekt vom Typ Ballon
Die Oberklasse Object JedeKlassein Java erbtvon Object automatisch und implizit Object Kugel Zwei Methoden in allen Subklassen verfügbar // Rerturns string representation of object String tostring(); // Indicates whether some other object is "equal to" // this one boolean equals(object obj); 22
Methoden aus Oberklasse Methoden aus Oberklasse können wie eigene Methoden aufgerufen werden müssen protected oder public sein 23
Konstruktoren Erzeugen eines Objekts entsprechender Konstruktor wird ausgeführt es können mehrere Konstruktoren vorhanden sein Neu: Erzeugen eines Objektes einer Unterklasse entsprechender Konstruktor der Oberklasse muss aufgerufen werden Initialisierung der Instanzvariablen public Class Kugel {... public Kugel(int x, int y) { this.x = x; this.y = y;... public Class BillardKugel extends Kugel { int number; public BillardKugel(int x, int y, int n) {????? number = n; 24
Konstruktoren ohne Parameter Oberklasse: Konstruktor ohne Parameter wird automatisch ausgeführt wird vor dem Konstruktor der Unterklasse ausgeführt public class Kugel {... public Kugel() {... this.x = 10; this.y = 10; public class BillardKugel extends Kugel { int number; public BillardKugel(int x, int y, int n) { number = n; 25
Konstruktoren mit Parameter Oberklasse: Konstruktoren mit Parameter müssen vom Programmierer ausgeführt werden muss erste Anweisung im Konstruktor der Unterklasse sein Aufruf: super(parameterliste); public Class Kugel {... public Kugel(int x, int y) {... this.x = x; this.y = y; public Class BillardKugel extends Kugel { int number; public BillardKugel(int x, int y, int n) { super(100, 100); number = n; 26
Konstruktoren Beispiel Objekt Zeppelin erzeugen Ausführung Konstruktoren 1. Object(); 2. Kugel(); 3. Ballon(); 4. Zeppelin(); Ausführung Hinweis Reihenfolge Aufruf - von unten nach oben Ausführung - von oben nach unten Aufruf 27
final: Attribute und Methoden Überschreiben verhindern Variablen und Methoden als final deklarieren können nicht überschrieben werden Beispiel public final static int DEFAULTX = 100; public final int DEFAULT_NUM = 10; public final void setpost(int x, int y) { this.x = x; this.y = y; Hinweis: final static - entspricht Konstanten in anderen Sprachen 28
final: Klassen Klassen können als final deklariert werden Klasse kann nicht erweitert werden alle Methoden der Klasse sind damit auch final Beispiel public final class BillardKugel extends Kugel {... Erschwert/verhindert Erweiterung eher sparsam einsetzen Beispiel: Klasse System ist als final deklariert 29
Polymorphismus Polymorphismus Vielgestaltigkeit Eigenschaft objektorientierter Sprachen Objekttyp bestimmt Wahl der korrekten Methode aus Menge gleichnamiger Methoden Aufruf der korrekten Methode zur Laufzeit entschieden - wird "dynamic binding" genannt Beispiel void draw(graphics g);... Kugel k = new Kugel(100, 100); k.draw(); // Objekttyp Kugel -> draw() aus Klasse Kugel Ballon b = new Ballon(200, 200); b.draw(); // Objekttyp Ballon -> draw() aus Klasse Ballon... 30
Prinzipien Polymorphismus Objekt behält immer Identität der Klasse aus der es instanziert wurde kann nie in ein Objekt einer anderen Klasse konvertiert werden Aufruf einer Methode eines Objektes Methode die mit Klasse des Objektes definiert wurde Kugel int x, y; void draw() Ballon BillardKugel changeradius() void draw() 31