Seite 1
Informatik II
Schnittstellen und Vererbung
Th Letschert, THM
Seite 2
Schnittstellen / Interfaces
Interface (Schnittstelle)Sprachkonstrukt in Java (und anderen modernen Progr.-Sprachen)
Sinn / Verwendung – Bringt zum Ausdruck, was Objekte einer Klasse können
Definition – ähnlich einer Klasse mit Schlüsselwort interface– beschreibt den Kopf von Methoden
Verwendung – in Klassendefinitionen
– als Erklärung (Zusicherung), dass die Klasse so definiert wird, dass alle Objekte die Methoden des Interfaces zur Verfügung stellen.
public interface Fahrkartenverkauf { FahrKarte verkaufe(Geld n);}
public class Schaffner implements Fahrkartenverkauf {
. . .
@Override public FahrKarte verkaufe(Geld n) { . . . }
. . .}
Interface: Was muss ein Fahrkartenverkäufer können
Implementierende Klasse: Objekte können als ein Fahrkartenverkäufer agieren
Seite 3
Schnittstellen / Interfaces
Interface (Schnittstelle)lockert den Bezug / die Abhängigkeit zwischen Klassen:Für den Kauf einer Fahrkarte braucht ein irgendeinen Fahrkartenverkäufer!
public class Kunde {
. . .
public void bahnFahre(Fahrkartenverkauf fahrkartenVerkauf, Geld g) { FahrKarte fahrkarte = fahrkartenVerkauf.verkaufe(g); . . . }
. . .
}
public static void main(String[] args) {
. . .
Kunde kunde = new Kunde();
kunde.bahnFahre(new Schaffner(), new Geld());
. . .
}
Der Kunde ist mit jeder Art von Fahrkartenverkäufer zufrieden.
public static void main(String[] args) {
. . .
Kunde kunde = new Kunde();
kunde.bahnFahre(new Automat(), new Geld());
. . .
}
Mal löst der Kunde die Karte beim Schaffner, . . . mal am Automat.
Seite 4
Schnittstellen / Interfaces
Interface (Schnittstelle)lockert den Bezug / die Abhängigkeit zwischen Klassen:Mit Gras kann man jeden Grasfresser füttern.
public static void main(String[] args) {
Bauer egon = new Bauer();
GrasFresser[] stall = new GrasFresser[3]; stall[0] = new Kuh(); stall[1] = new Schaf(); stall[2] = new Kuh();
Gras[] grasVorrat = new Gras[3]; grasVorrat[0] = new Gras(); grasVorrat[1] = new Gras(); grasVorrat[2] = new Gras();
egon.fuettern(stall, grasVorrat);}
Nun fresst schön ihr GrasFresser!
public class Bauer { public final void fuettern(GrasFresser[] stall, Gras[] grasVorrat) { int i = 0; for (GrasFresser fresser : stall) { fresser.fresse(grasVorrat[i++]); } }}
Bauer egon
class Kuh implements GrasFresser { . . . @Override public void fresse(Gras g) { … } . . .}
class Schaf implements GrasFresser { . . . @Override public void fresse(Gras g) { … } . . .}
Seite 5
Schnittstellen / Interfaces
UML-Diagramm Klasse - Interface (Schnittstelle)
UML
– Unified Modeling Language– (nicht nur in der Informatik) wichtige Diagrammtechnik
Klassendiagramm
– Darstellung von Klassen und Interfaces
Schaf
GrasFresser
<<realize>>
Kuh
<<realize>>
Schaffner
Fahrkartenverkauf
veraufe(Geld) : Fahrkarte
<<realize>>
Automat
<<realize>>
Klassendiagramm mit zwei Klassen und einem Interface
Im Piktogramm von Klassen und Interfaces könne die Methoden aufgelistet werden.
Seite 6
Schnittstellen / Interfaces
Das Konzept Interface ist sehr wichtig für einen modernen Programmierstil in Java und anderen modernen OO-Sprachen.
– Ein Interface trennt Verhalten / Verwendbarkeit von Implementierungen.
– Ein Interface definiert einen Typ: D.h. Eine Verwendungsmöglichkeit für Objekte !
– Eine Klasse, die ein Interface implementiert, kann Objekte erzeugen, die entsprechend verwendbar sind.
– Variablen und Parameter sollten als Typ (wenn möglich) ein Interface haben. Der Typ einer Variablen / eines Typs kann so die minimale Anforderung an deren Inhalte (Werte) formulieren.
Seite 7
Objektorientierung
OO „philosophisch“
These der Objektorientierung
Die Konzepte der Objektorientierung sind
• nicht nur nützlich bei der Programmierung,
• sie entsprechen der Organisation der realen Welt
• und sind damit als Basis für alle IT-Lösungen ideal geeignet.
Seite 8
Modellbildung objektorientiert
Objektorientierte Datenmodellierung: Klassen und Objekte
Gegebenheiten der Welt werden verstanden als Klassen – Arten von Dingen Objekte – Individuen
Klassifikation Analytisch: Vom Individuellen zum Allgemeinen
Klassifizierung von existierenden ObjektenFifi, Struppi => Hund
Konstruktiv: Vom Allgemeinen zum IndividuellenEigenschaften definieren Objekte mit diesen EigenschaftenMensch der studiert (besondere Art von Mensch)
=> Student
Hund
Mensch
Seite 9
Modellbildung objektorientiert
Objektorientierte Datenmodellierung: Klassen
KlasseDefiniert eine Kollektion von Objekten mit
gemeinsamer Struktur (Attribute)
gemeinsamem Verhalten (Methoden)
gemeinsamen Beziehungen zu anderen Objekten
Definiert einen Mechanismus um Objekte zu erzeugen Konstruktor
Seite 10
Modellbildung objektorientiert
Objektorientierte Datenmodellierung: Klassen
Klassendiagramm: Darstellung von Klassenmit ihren Methoden und Attributen
und den Beziehungen einer Klasse zur anderen
der Objekte der einen Klasse zu den Objekten anderer Klassen
Kunde
name
Konto
nr
einzahlen()abheben()
besitzt
1 *
Jeder Kunde hat einen NamenJedes Konto hat eine NummerJeder Kunde besitzt beliebig viele KontenJedes Konto hat genau einen Besitzer
Seite 11
Modellbildung objektorientiert
Objektorientierte Datenmodellierung: Vererbung
KlasseDefiniert eine Kollektion von Objekten
Unterklasse(Subklasse / abgeleitete Klasse)
Definiert eine Kollektion von Objekten mit zusätzlichen Attributen und / oder zusätzlichen Methoden
Seite 12
Modellbildung objektorientiert
Objektorientierte Datenmodellierung: Vererbung
Klasse und UnterklasseAllgemeines und Spezialisierung : „ist ein“
Person
Student Angestellter
ET MB AdminstratorDozent
ist ein
abgeleitete Klasse,
Subklasse
Basisklasse, Oberklasse, Superklasse
Basisklasse
Subklasse
Seite 13
Modellbildung objektorientiert
Objektorientierte Datenmodellierung: Vererbung
Vererbung ist ein natürliches / reales Konzept
aus Herold, Lurz, Wohlrab: Grundlagen der Informatik
Seite 14
Modellbildung objektorientiert
Objektorientierte Datenmodellierung: Vererbung
Vererbung : Übernehmen („erben“) und Erweitern der Eigenschaften
Person
nameadresse
essen()schlafen()
Student
matrikelnr
studieren()
Angestellter
personalnr
arbeiten()
Personen - haben name und adresse - können essen, schlafen
Studenten - haben name, adresse und matrikelnr - können essen, schlafen und studieren
Angestellte - haben name, adresse und personalnr - können essen, schlafen und arbeiten
Seite 15
Modellbildung objektorientiert
Basisklasse oder Interface
Interface Klassen mit gemeinsamem Interface haben Instanzen mit gemeinsamen Schnittstellen (Methoden mit gleichen Namen, Parametertypen und Ergebnistypen.) Jedes Objekt jeder dieser Klassen kann an Stelle jedes anderen treten.Implementierung: „kann als … verwendet werden.“Beispiel: Fahrkartenverkäufer ~> Automat und Schaffner
Basisklasse
Klassen mit gemeinsamer Basisklasse haben Instanzen mit Eigenschaften (Methoden oder Attribute).Jedes Objekt jeder dieser Klassen hat Gemeinsamkeiten mit jedem anderen.Ableitung: „ist eine besondere Art von ...“Beispiel: Mensch ~> Schaffner, Student
Seite 16
Programmierung objektorientiert
Objektorientierte Programmierung: Vererbung
Vererbung : Übernehmen („erben“) und Erweitern der Eigenschaften
Person
nameadresse
essen()schlafen()
Student
matrikelnr
studieren()
Angestellter
personalnr
arbeiten()
class Person { private String name; private Adresse adresse;
public Person(String name, Adresse adresse) { this.name = name; this.adresse = adresse; } public void essen() { System.out.println("Speise nach Menschenart"); } public void schlafen() { System.out.println("Schlafe nach Menschenart"); }}
class Student extends Person { private int matrikelNr;
public Student(String name, Adresse adresse, int matrikelNr) { super(name, adresse); this.matrikelNr = matrikelNr; } public void essen() { System.out.println("Speise wie ein Student"); } public void schlafen() { System.out.println("Schlafe wie ein Student"); }}
class Angestellter extends Person { private int personalNr;
public Angestellter(String name, Adresse adresse, int personalNr) { super(name, adresse); this.matrikelNr = personalNr; } public void arbeiten() { System.out.println("Arbeite wie ein Angestellter"); }}
Aufruf des Konstruktors der Ober- (Super-) Klasse
Seite 17
Programmierung objektorientiert
Vererbung
Vererbung : Übernehmen („erben“) und Erweitern der Eigenschaften
class Person { private String name; private Adresse adresse;
public Person(String name, Adresse adresse) { this.name = name; this.adresse = adresse; } public void essen() { System.out.println("Speise nach Menschenart"); } public void schlafen() { System.out.println("Schlafe nach Menschenart"); }}
class Student extends Person { private int matrikelNr;
public Student(String name, Adresse adresse, int matrikelNr) { super(name, adresse); this.matrikelNr = matrikelNr; } public void essen() { System.out.println("Speise wie ein Student"); } public void schlafen() { System.out.println("Schlafe wie ein Student"); }}
class Angestellter extends Person { private int personalNr;
public Angestellter(String name, Adresse adresse, int personalNr) { super(name, adresse); this.matrikelNr = personalNr; } public void arbeiten() { System.out.println("Arbeite wie ein Angestellter"); }}
Jedes Objekt der Klasse Person hat einen Namen und eine Adresse
Jedes Objekt der Klasse Student hat einen Namen, eine Adresse und eine Matrikelnummer. Name und Adresse sind vorhanden aber nicht direkt zugreifbar.
Jedes Objekt der Klasse Angestellter hat einen Namen, eine Adresse und eine Personalnummer. Name und Adresse sind vorhanden aber nicht direkt zugreifbar.
Seite 18
Programmierung objektorientiert
Sichtbarkeit Protected
Protected: kann auch von Unterklassen zugegriffen werden.
class Person { protected String name; protected String adresse;
public Person(String name, String adresse) { this.name = name; this.adresse = adresse; } public void essen() { System.out.println(name + " speist nach Menschenart"); } public void schlafen() { System.out.println(name + " Schlaeft nach Menschenart"); }}
class Student extends Person { private int matrikelNr;
public Student(String name, String adresse, int matrikelNr) { super(name, adresse); this.matrikelNr = matrikelNr; } public void essen() { System.out.println(name + " speist wie ein Student"); } public void schlafen() { System.out.println(name + " schlaeft wie ein Student"); }}
Person karl = new Person("Karl", "Waldweg 25");Student emil= new Student("Emil", "Stadtstrasse 12", 12345); karl.essen();karl.schlafen(); emil.essen();emil.schlafen();
Karl speist nach MenschenartKarl Schlaeft nach MenschenartEmil speist wie ein StudentEmil Schlaeft wie ein Student
Seite 19
Modellbildung objektorientiert
Abstrakte Klasse: zwischen Basisklasse und Interface
abstrakte Klassen mischen das Konzept Interface und Basisklasse.
Eine abstrakte Klasse kann völlig un-implementierte Methoden definieren
(wie ein Interface) und gleichzeitig Gemeinsames für alle abgeleiteten Klassen definieren
(wie eine Basisklasse)
public abstract class Auto {
private double spritmenge;
protected abstract void beschleunigen(double gas); protected abstract double verbrauch();
public void gasgeben(int pedalstellung, double dauer) { spritmenge = spritmenge - pedalstellung*verbrauch()*dauer; beschleunigen(pedalstellung*verbrauch()*dauer); }
}
Gemeinsamkeit aller Instanzen aller Ableitungen
Spezielle Eigenschaften unterschiedlicher Ableitungen.
Gemeinsamkeit aller Instanzen aller Ableitungen, beruht auf speziellen Eigenschaften unterschiedlicher Ableitungen.
Beispiel Einsatz einer abstrakten Methode: protected abstract muss in Ableitungen definiert werden, wird
aber immer gleich genutzt.
Auto{abstract}
spritmenge
verbrauch()gasgeben()
Seite 20
Programmierung objektorientiert
Statischer und dynamischer Typ
statischer Typ: Typ der Variablen und Parameter
dynamischer Typ: Typ der Objekte
Zugriffsprinzip bei Java der statische Typ entscheidet über den Zugriff bei Attributen (Objektvariablen) der dynamische Typ entscheidet über den Zugriff bei Methoden
class Basis { int attribut = 0; int getAttribut () { return attribut; }}
class Abgeleitet extends Basis { int attribut = -10; int getAttribut () { return attribut; }}
Basis basis = new Basis();Abgeleitet abgeleitet = new Abgeleitet();Basis abgeleitetInBasis = new Abgeleitet();
System.out.println("basis.attribut = " + basis.attribut);System.out.println("abgeleitet.attribut = " + abgeleitet.attribut);System.out.println("abgeleitetInBasis.attribut = " + abgeleitetInBasis.attribut);System.out.println();System.out.println("basis.getAttribut() = " + basis.getAttribut());System.out.println("abgeleitet.getAttribut() = " + abgeleitet.getAttribut());System.out.println("abgeleitetInBasis.getAttribut() = " + abgeleitetInBasis.getAttribut());
basis.attribut = 0abgeleitet.attribut = -10abgeleitetInBasis.attribut = 0
basis.getAttribut() = 0abgeleitet.getAttribut() = -10abgeleitetInBasis.getAttribut() = -10
Seite 21
Programmierung objektorientiert
Zugriffsprinzip
Zugriffsprinzip bei Java der statische Typ entscheidet über den Zugriff bei Attributen (Objektvariablen) der dynamische Typ entscheidet über den Zugriff bei Methoden
Allgemein Überdecken: der statische Typ entscheidet über den Zugriff Überschreiben: der dynamische Typ entscheidet über den Zugriff
das Überschreiben wird auch Polymorphismus genannt.
In C++ kann man stets zwischen Überdecken und Überschreiben wählen.Java-Prinzip: mach es einfach und so, dass es von Programmierern intuitiv richtig verwendet wird – auch wenn sie es nicht wirklich verstehen.
Seite 22
Modellbildung objektorientiert
Objektorientierte Datenmodellierung: Polymorphismus
Vererbung : Übernehmen („erben“) und Erweitern oder Überschreiben der Eigenschaften
Personen - haben name - können essen
Studenten - haben name und matrikelnr - können essen und trinken : sie trinken aber auf besondere (Studenten-) Art
Student
matrikelnr
trinken()
Person
name
essen()trinken()
Polymorphismus
Seite 23
Objektorientierung im Programmcode
Objektorientierte Programmierung
Polymorphismus: Klasse und Subklasse mit überschriebener Methode
Student
matrikelnr
trinken()
Person
name
essen()trinken()
Person karla = new Person('Karla')Student emil = new Student('Emil', 4711)
karla.essen()emil.essen()
karla.trinken()emil.trinken()
mapfmapf
schluckgluck gluck gluck
Personen - haben einen Namen - können essen und trinken
Studenten - haben einen Namen (weil sie Personen sind) - können essen und trinken (weil sie Personen sind) allerdings trinken sie anders als Personen allgemein trinken: sie trinken nach Studentenart.
karla ist eine Person mit allem was Personen haben und können.emil ist eine Person mit allem was Personen haben und können.
Seite 24
Objektorientierung im Programmcode
Objektorientierte Programmierung
Polymorphismus: Klasse und Subklasse mit
überschriebener Methode
Student
matrikelnr
trinken()
Person
name
essen()trinken()
class Person { private String name;
public Person(String name) { this.name = name; } public void essen() { System.out.println “mapf“); } public void trinken() { System.out.println(“schluck“); }}
class Student extends Person { private int matrikelnr;
public Student(String name, int matrikelnr) { super(name); this.matrikelnr = matrikelnr; }
public void trinken() { System.out.println(“gluck gluck gluck“); }}
redefiniert, überschrieben
Seite 25
Objektorientierung im Programmcode
Objektorientierte Programmierung
Polymorphismus : Klasse und Subklasse mit überschriebener Methode
Polymorphismus = Vielgestaltigkeit
Objekte die für Personen gehalten werdenkönnen sich „anders“ verhalten
sie verhalten sich eventuell wie Studenten
Student
matrikelnr
trinken()
Person
name
essen()trinken()
So wie der trinkt,muss das ein Student sein.
Seite 26
Objektorientierung im Programmcode
Objektorientierte Programmierung
Polymorphismus : Klasse und Subklasse mit überschriebener Methode
Aus Sicht des Benutzers, der nicht weiß zu welcher (Unter-) Art ein Objekt gehört, treten die Objekte „vielgestaltig“ / polymorph auf.
Student
matrikelnr
trinken()
Person
name
essen()trinken()
So wie der trinkt,muss das ein Student sein.
public class Bar {
public void fuelleAb(Person p) { while(true) { p.trinken(); } }}
public static void main(String[] args) {
Person hugo = new Person("Hugo"); Student karla = new Student("Karla", 4711);
Bar kakadu = new Bar(); kakadu.fuelleAb(hugo); kakadu.fuelleAb(karla);}
gluck gluck
schluck
schluck
gluck gluck
alle Personen zugelassen, natürlich auch Studenten
Seite 27
Objektorientierung im Programmcode
Objektorientierte Programmierung
Polymorphismus : Klasse und Subklasse mit überschriebener Methode
Unterschiedliche Benutzer haben unterschiedliche Erwartungen an die Art (Klasse / Typ) des benutzten Objekts.
Student
matrikelnr
trinken()
Person
name
essen()trinken()
kakadu: Bar
Jeder ist will-kommen
der trinken kann
Objekte der Klasse Person und Objekte jeder Unterklasse sind in einer Bar
willkommen zum Abfüllen.
letschert: Dozent
Jeder Student ist willkommen.
Objekte der Klasse Student und Objekte jeder Unterklasse sind in einem
Unterricht willkommen.
Seite 28
Objektorientierung im Programmcode
Objektorientierte Programmierung
Polymorphismus : Klasse und Subklasse mit überschriebener Methode
Unterschiedliche Benutzer haben unterschiedliche Erwartungen an die Art (Klasse / Typ) des benutzten Objekts.
Student
matrikelnr
trinken()
Person
name
essen()trinken()
letschert: Dozent
public class Dozent extends Person { public Dozent(String name) { super(name); } public void unterricht(Student student) { ··· }} public static void main(String[] args) {
Person hugo = new Person("Hugo"); Student karla = new Student("Karla", 4711); Student claudi = new MBStudent("Claudi", 4712); Dozent letschert = new Dozent("Letschert");
Bar kakadu = new Bar(); kakadu.fuelleAb(hugo); kakadu.fuelleAb(karla); kakadu.fuelleAb(claudi);
letschert.unterricht(hugo); letschert.unterricht(karla); letschert.unterricht(claudi);}
Studenten jeder Art sind zugelassen, Personen allgemein nicht.
kakadu: Bar
Seite 29
Objektorientierung
Objektorientierte Entwicklung
Die Objektorientierte Entwicklung beruht auf folgenden GrundgedankenUnterscheidung Klasse und ObjektVererbung:
Klassen können oft in Ober- und Unterklasse unterschieden werden Eine Klasse B ist genau dann eine Unterklasse einer Klasse A, wenn
alle Objekte der Klasse B all das haben, wissen und könnenwas alle Objekte der Klasse A haben, wissen, können.
Achtung: das ist so ähnlich wie eine Teilmengen-Relation aber nicht das gleiche!
Polymorphismus Der Benutzer eines Objekts nutzt es es mit dem Wissen über die Klasse
zu der es gehört, die genaue Unterklasse ist ihm nicht bekannt. Die Klasse definiert das grundsätzliche Verhalten auf das der Benutzer
sich verlassen kann Feinheiten im Verhalten ergeben sich aus der Unterklasse. Sie sind für
den Benutzer des Objekts nicht relevant