41
Abstrakte Klassen

Abstrakte Klassen. Es gibt in der realen Welt kein Tier, das ein allgemeines, unspezifiziertes Nutztier ist, sondern nur spezielle Unterarten von Nutztieren,

Embed Size (px)

Citation preview

Page 1: Abstrakte Klassen. Es gibt in der realen Welt kein Tier, das ein allgemeines, unspezifiziertes Nutztier ist, sondern nur spezielle Unterarten von Nutztieren,

Abstrakte Klassen

Page 2: Abstrakte Klassen. Es gibt in der realen Welt kein Tier, das ein allgemeines, unspezifiziertes Nutztier ist, sondern nur spezielle Unterarten von Nutztieren,

Es gibt in der realen Welt kein Tier, das ein allgemeines, unspezifiziertes Nutztier ist, sondern nur spezielle Unterarten von Nutztieren, z.B. eine Kuh oder eine Henne.

Page 3: Abstrakte Klassen. Es gibt in der realen Welt kein Tier, das ein allgemeines, unspezifiziertes Nutztier ist, sondern nur spezielle Unterarten von Nutztieren,

Es macht also keinen Sinn, ein Exemplar der Klasse "Nutztier" zu bilden. Dies realisiert man mit einer sogenannten abstrakten Klasse, wie z.B. der Klasse "Nutztier" durch den Vorsatz abstract.

Page 4: Abstrakte Klassen. Es gibt in der realen Welt kein Tier, das ein allgemeines, unspezifiziertes Nutztier ist, sondern nur spezielle Unterarten von Nutztieren,

Da es also keinen Sinn macht, ein Exemplar der Klasse Nutztier zu erzeugen, ergibt es eine Fehlermeldung des Compilers, falls man dies machen würde. Man darf also abstrakte Klassen nicht instanzieren (d.h. man kann keine Objekte davon erzeugen).

Page 5: Abstrakte Klassen. Es gibt in der realen Welt kein Tier, das ein allgemeines, unspezifiziertes Nutztier ist, sondern nur spezielle Unterarten von Nutztieren,

Ansonsten verhalten sich abstrakte Klassen wie "normale" Klassen, sie können z.B. von anderen Klassen erben, Attribute und "normale" Methoden enthalten.In der Klasse "Nutztier" kann dies also z.B. wie folgt realisiert werden:

Page 6: Abstrakte Klassen. Es gibt in der realen Welt kein Tier, das ein allgemeines, unspezifiziertes Nutztier ist, sondern nur spezielle Unterarten von Nutztieren,

abstract class Nutztier{ private String name;

public Nutztier(String pName){ name = pName; } // und noch weitere Attribute // und set- und get-Methoden} Warum gibt es den Konstruktor Nutztier, wenn

kein Objekt dieser Klasse erzeugt werden kann?

Der Konstruktor kann in einem Konstruktor einer Unterklasse aufgerufen werden.

Wie wird der Konstruktor der Oberklasse im Konstruktor einer Unterklasse aufgerufen?

Mit super(...)

Page 7: Abstrakte Klassen. Es gibt in der realen Welt kein Tier, das ein allgemeines, unspezifiziertes Nutztier ist, sondern nur spezielle Unterarten von Nutztieren,

Eine Oberklasse wie z.B. Nutztier kann einer Unterklasse wie z.B. Henne oder Kuh eine oder mehrere Methoden bereitstellen, von denen die Oberklasse aber nicht weiß, wie diese genau implementiert werden sollen (dies wissen nur die Unterklassen). Diese nennt man eine abstrakte Methode.

Page 8: Abstrakte Klassen. Es gibt in der realen Welt kein Tier, das ein allgemeines, unspezifiziertes Nutztier ist, sondern nur spezielle Unterarten von Nutztieren,

Eine abstrakte Methode in der Oberklasse Nutztier, wie z.B. "getTierwert()" definiert lediglich den Methodenkopf und drückt damit aus, dass die Oberklasse keine Ahnung von der Implementierung hat und die jeweilige Unterklasse Henne oder Kuh sich darum kümmern muss.

Page 9: Abstrakte Klassen. Es gibt in der realen Welt kein Tier, das ein allgemeines, unspezifiziertes Nutztier ist, sondern nur spezielle Unterarten von Nutztieren,

Dies macht in der Methode getTierwert() auch Sinn, da der Marktwert des Tiers von der Leistungsfähigkeit (z.B. der Legeleistung einer Henne, oder der Milchleistung einer Kuh) eines Tiers abhängt, von den Attributen "legeLeistung" und "milchLeistung" nur die jeweilige Unterklasse etwas weiss, aber die Oberklasse keine Ahnung davon hat.In der Klasse "Nutztier" wird dies also z.B. wie folgt realisiert:

Page 10: Abstrakte Klassen. Es gibt in der realen Welt kein Tier, das ein allgemeines, unspezifiziertes Nutztier ist, sondern nur spezielle Unterarten von Nutztieren,

abstract class Nutztier{ private String name;

public Nutztier(String pName){ name = pName; }

// und noch weitere Attribute // und set- und get-Methoden

public abstract double getTierwert();Die Implementierung (Ausprogrammierung) der abstrakten Methode muss dann in der jeweiligen Unterklasse stattfinden!!!

}

Page 11: Abstrakte Klassen. Es gibt in der realen Welt kein Tier, das ein allgemeines, unspezifiziertes Nutztier ist, sondern nur spezielle Unterarten von Nutztieren,

abstract class Nutztier{ private String name;

public Nutztier(String pName){ name = pName; }

// und noch weitere Attribute // und set- und get-Methoden

public abstract double getTierwert();Zusätzlich will man noch eine Methode getGewinn() implementieren, wobei der Gewinn 10% des Marktwerts des Tiers beträgt. Implementieren Sie die Methode getGewinn() in der Klasse Nutztier.

}

Page 12: Abstrakte Klassen. Es gibt in der realen Welt kein Tier, das ein allgemeines, unspezifiziertes Nutztier ist, sondern nur spezielle Unterarten von Nutztieren,

abstract class Nutztier{ private String name;

public Nutztier(String pName){ name = pName; }

// und noch weitere Attribute // und set- und get-Methoden

public abstract double getTierwert();

public double getGewinn(){ return(0.1*getTierwert()); }}

Page 13: Abstrakte Klassen. Es gibt in der realen Welt kein Tier, das ein allgemeines, unspezifiziertes Nutztier ist, sondern nur spezielle Unterarten von Nutztieren,

class Henne extends Nutztier { private int legeLeistung;

}

public Henne(String pName, int plegeLeistung){ super(pName); legeLeistung = plegeLeistung; }

Der Marktwert einer Henne berechnet sich aus dem doppelten Wert der Legeleistung. Implementieren Sie die Methode getTierwert() in der Klasse Henne.

public double getTierwert(){ return(2 * legeLeistung); } Implementieren Sie einen Konstruktor mit 2 Parametern.

Page 14: Abstrakte Klassen. Es gibt in der realen Welt kein Tier, das ein allgemeines, unspezifiziertes Nutztier ist, sondern nur spezielle Unterarten von Nutztieren,

class Kuh extends Nutztier{ private double milchLeistung;

}

public double getTierwert(){ return(10 * milchLeistung); }

Der Marktwert einer Kuh berechnet sich aus dem zehnfachen Wert der Milchleistung. Implementieren Sie die Methode getTierwert() in der Klasse Kuh.

public Kuh(String pName, double pMilchLeistung){ super(pName); milchLeistung=pMilchLeistung; }

Implementieren Sie einen Konstruktor mit 2 Parametern.

Page 15: Abstrakte Klassen. Es gibt in der realen Welt kein Tier, das ein allgemeines, unspezifiziertes Nutztier ist, sondern nur spezielle Unterarten von Nutztieren,

public class MainAbstrakt{ public static void main( String[] args){ double w1, w2, w3, w4; Kuh myk=new Kuh("Elsa", 100); Henne myh=new Henne("Ute",1); w1=myk.getTierwert(); w2=myh.getTierwert(); w3=myk.getGewinn(); w4=myh.getGewinn(); }}

Welche Werte haben w1, w2, w3, w4 ?

w1 = 10 *100 = 1000

w2 = 2 *1 = 2

w3 = 0,1 * 1000 = 100

w4 = 0,1 * 2 = 0,2

Page 16: Abstrakte Klassen. Es gibt in der realen Welt kein Tier, das ein allgemeines, unspezifiziertes Nutztier ist, sondern nur spezielle Unterarten von Nutztieren,

Bemerkung:

Page 17: Abstrakte Klassen. Es gibt in der realen Welt kein Tier, das ein allgemeines, unspezifiziertes Nutztier ist, sondern nur spezielle Unterarten von Nutztieren,

abstract class Nutztier{ private String name;

public Nutztier(String pName){ name = pName; }

// und noch weitere Attribute // und set- und get-Methoden

public abstract double getTierwert();

}

statt dem könnte man auch schreiben:

Page 18: Abstrakte Klassen. Es gibt in der realen Welt kein Tier, das ein allgemeines, unspezifiziertes Nutztier ist, sondern nur spezielle Unterarten von Nutztieren,

abstract class Nutztier{ private String name;

public Nutztier(String pName){ name = pName; }

// und noch weitere Attribute // und set- und get-Methoden

abstract public double getTierwert();

}

statt dem könnte man auch schreiben:

Page 19: Abstrakte Klassen. Es gibt in der realen Welt kein Tier, das ein allgemeines, unspezifiziertes Nutztier ist, sondern nur spezielle Unterarten von Nutztieren,

abstract class Nutztier{ private String name;

public Nutztier(String pName){ name = pName; }

// und noch weitere Attribute // und set- und get-Methoden

abstract public double getTierwert();

}

doch die vorige Schreibweise wird lieber von den Java-Programmierern benutzt.

Page 20: Abstrakte Klassen. Es gibt in der realen Welt kein Tier, das ein allgemeines, unspezifiziertes Nutztier ist, sondern nur spezielle Unterarten von Nutztieren,

Was soll das mit den abstrakten Methoden?Man könnte das vorige Programm doch auch ohne abstrakte Methode machen.Realisieren Sie das vorige Programm ohne abstrakte Methode.

Page 21: Abstrakte Klassen. Es gibt in der realen Welt kein Tier, das ein allgemeines, unspezifiziertes Nutztier ist, sondern nur spezielle Unterarten von Nutztieren,

In welcher Klasse muss in welcher Methode was geändert werden?(im folgenden Programm werden die Änderungen rot markiert).

Page 22: Abstrakte Klassen. Es gibt in der realen Welt kein Tier, das ein allgemeines, unspezifiziertes Nutztier ist, sondern nur spezielle Unterarten von Nutztieren,

Die einzige Klasse, die geändert werden muss, ist die Klasse Nutztier. Dort muss nur die Methode getTierwert() verändert werden.

Page 23: Abstrakte Klassen. Es gibt in der realen Welt kein Tier, das ein allgemeines, unspezifiziertes Nutztier ist, sondern nur spezielle Unterarten von Nutztieren,

class Nutztier{ private String name;

public Nutztier(String pName){ name = pName; }

public double getTierwert(){ return 123; }

public double getGewinn(){ return(0.1*getTierwert()); }}

Da getTierwert() in der Methode getGewinn() verwendet wird.

Warum muss die Methode getTierwert() in der Klasse Nutztier implementiert werden?

Page 24: Abstrakte Klassen. Es gibt in der realen Welt kein Tier, das ein allgemeines, unspezifiziertes Nutztier ist, sondern nur spezielle Unterarten von Nutztieren,

class Nutztier{ private String name;

public Nutztier(String pName){ name = pName; }

public double getTierwert(){ return 123; }

public double getGewinn(){ return(0.1*getTierwert()); }}

Da getTierwert() einen Rückgabewert verlangt, muss man irgend etwas zurückgeben.

Page 25: Abstrakte Klassen. Es gibt in der realen Welt kein Tier, das ein allgemeines, unspezifiziertes Nutztier ist, sondern nur spezielle Unterarten von Nutztieren,

class Nutztier{ private String name;

public Nutztier(String pName){ name = pName; }

public double getTierwert(){ return 123; }

public double getGewinn(){ return(0.1*getTierwert()); }} Angenommen, der Programmierer der Klasse Henne und Kuh

hätte vergessen, die Methode getTierwert() zu implementieren. Welche Werte hätten dann w1, w2, w3, w4 in main?

Page 26: Abstrakte Klassen. Es gibt in der realen Welt kein Tier, das ein allgemeines, unspezifiziertes Nutztier ist, sondern nur spezielle Unterarten von Nutztieren,

public class MainAbstrakt{ public static void main( String[] args){ double w1, w2, w3, w4; Kuh myk=new Kuh("Elsa",100); Henne myh=new Henne("Ute",1); w1=myk.getTierwert(); w2=myh.getTierwert(); w3=myk.getGewinn(); w4=myh.getGewinn(); }}

getTierwert() gibt es nicht mehr in Kuh und Henne. Wo holt sich der Compiler dann diese Methode?

w1 = 123

w2 = 123

w3 = 0,1 * 123 = 12,3

w4 = 0,1 * 123 = 12,3

Aus der Methode in der Oberklasse, also aus getTierwert () in der Klasse Nutztier. Diese liefert immer den Wert 123 zurück!

Page 27: Abstrakte Klassen. Es gibt in der realen Welt kein Tier, das ein allgemeines, unspezifiziertes Nutztier ist, sondern nur spezielle Unterarten von Nutztieren,

public class MainAbstrakt{ public static void main( String[] args){ double w1, w2, w3, w4; Kuh myk=new Kuh("Elsa",100); Henne myh=new Henne("Ute",1); w1=myk.getTierwert(); w2=myh.getTierwert(); w3=myk.getGewinn(); w4=myh.getGewinn(); }} Angenommen, der Programmierer der Klasse Henne und Kuh hätte

vergessen, die Methode getTierwert() zu implementieren und die Methode getTierwert() wäre abstrakt. Was würde geschehen?

Der Compiler würde eine Fehlermeldung geben, weil er in diesen Unterklassen eine ausprogrammierte Methode erwartet.

Page 28: Abstrakte Klassen. Es gibt in der realen Welt kein Tier, das ein allgemeines, unspezifiziertes Nutztier ist, sondern nur spezielle Unterarten von Nutztieren,

public class MainAbstrakt{ public static void main( String[] args){ double w1, w2, w3, w4; Kuh myk=new Kuh("Elsa",100); Henne myh=new Henne("Ute",1); w1=myk.getTierwert(); w2=myh.getTierwert(); w3=myk.getGewinn(); w4=myh.getGewinn(); }}Also: Die Verwendung einer abstrakten Methode unterstützt hier den Programmierer fehlerfreier zu programmieren.

Page 29: Abstrakte Klassen. Es gibt in der realen Welt kein Tier, das ein allgemeines, unspezifiziertes Nutztier ist, sondern nur spezielle Unterarten von Nutztieren,

Wichtige Bemerkungen

Page 30: Abstrakte Klassen. Es gibt in der realen Welt kein Tier, das ein allgemeines, unspezifiziertes Nutztier ist, sondern nur spezielle Unterarten von Nutztieren,

1) Wenn eine abstrakte Methode in einer Klasse verwendet wird, dann muss diese Klasse eine abstrakte Klasse sein. 2) Wenn eine Klasse abstrakt ist, dann müssen die sich darin befindlichen Methoden nicht alle abstrakt sein (sie kann auch gar keine abstrakte Methoden besitzen).

Page 31: Abstrakte Klassen. Es gibt in der realen Welt kein Tier, das ein allgemeines, unspezifiziertes Nutztier ist, sondern nur spezielle Unterarten von Nutztieren,

3) Wenn eine abstrakte Methode in der Unterklasse nicht ausprogrammiert wird, dann bedeutet dies, dass diese abstrakte Methode an die Unterklasse vererbt wurde. Da sich dann in dieser Unterklasse eine abstrakte Methode befindet, muss die Klasse abstrakt sein (d.h. sie muss mit abstract gekennzeichnet werden), außer sie wird wieder vererbt. 4) Wenn man eine Klassenhierarchie (bzgl. Vererbung) entwickelt, ist es oft sinnvoll, die hierarchisch am weitesten oben stehende Klasse abstract zu machen.

Page 32: Abstrakte Klassen. Es gibt in der realen Welt kein Tier, das ein allgemeines, unspezifiziertes Nutztier ist, sondern nur spezielle Unterarten von Nutztieren,

Aufgabe:Erstellen Sie die Klassen Rechteck und Kreis, die die gemeinsame Oberklasse GeoForm haben sollen mit den entsprechenden Attributen und Methoden.Die Klasse GeoForm soll noch eine Methode getVolumen(..) spendiert bekommen, so dass die Klassen Rechteck und Kreis mit Hilfe dieser Methode das Volumen der Körper berechnen können, die als Grundfläche Rechtecke und Kreise haben (Quader bzw. Zylinder).

Page 33: Abstrakte Klassen. Es gibt in der realen Welt kein Tier, das ein allgemeines, unspezifiziertes Nutztier ist, sondern nur spezielle Unterarten von Nutztieren,

abstract class GeoForm { public double getVolumen( double pHoehe){ return( getFlaecheninhalt()*pHoehe); }

public abstract double getFlaecheninhalt();}

Page 34: Abstrakte Klassen. Es gibt in der realen Welt kein Tier, das ein allgemeines, unspezifiziertes Nutztier ist, sondern nur spezielle Unterarten von Nutztieren,

class Rechteck extends GeoForm{ private double laenge; private double breite;

public Rechteck(double pLaenge, double pBreite){ setLaenge(pLaenge); setBreite(pBreite); }

public void setLaenge( double pLaenge){ laenge = pLaenge; }

Page 35: Abstrakte Klassen. Es gibt in der realen Welt kein Tier, das ein allgemeines, unspezifiziertes Nutztier ist, sondern nur spezielle Unterarten von Nutztieren,

public void setBreite( double pBreite){ breite = pBreite; }

public double getLaenge(){ return(laenge); }

public double getBreite(){ return(breite); }

public double getFlaecheninhalt(){ return(laenge * breite); }}

Page 36: Abstrakte Klassen. Es gibt in der realen Welt kein Tier, das ein allgemeines, unspezifiziertes Nutztier ist, sondern nur spezielle Unterarten von Nutztieren,

class Kreis extends GeoForm{ private double radius;

public Kreis(double pRadius){ setRadius(pRadius); }

public void setRadius( double pRadius){ radius = pRadius; }

public double getRadius(){ return(radius); }

public double getFlaecheninhalt(){ return(3.14*radius*radius); }}

Page 37: Abstrakte Klassen. Es gibt in der realen Welt kein Tier, das ein allgemeines, unspezifiziertes Nutztier ist, sondern nur spezielle Unterarten von Nutztieren,

public class MainAbstrakte1{ public static void main( String[] args){ double v1, v2; Rechteck r; Kreis k; r = new Rechteck(2,5); k = new Kreis(1); v1=r.getVolumen(10); v2=k.getVolumen(10); System.out.println("v1= "+v1); System.out.println("v1= "+v2); }} v1 = 2 * 5 * 10

v2 = 3.14 * 1 * 1 * 10

Welche Werte haben v1, v2 ?

Page 38: Abstrakte Klassen. Es gibt in der realen Welt kein Tier, das ein allgemeines, unspezifiziertes Nutztier ist, sondern nur spezielle Unterarten von Nutztieren,

Abstrakte Klassen und Methoden in

UML-Darstellung:

Page 39: Abstrakte Klassen. Es gibt in der realen Welt kein Tier, das ein allgemeines, unspezifiziertes Nutztier ist, sondern nur spezielle Unterarten von Nutztieren,

Nutztier+ printAllAttributs(): void

Kuh+printAllAttributs():void

Henne+printAllAttributs():void

Abstrakte Klassen und Methoden werden durch eine kursive Schreibweise gekennzeichnet.

Page 40: Abstrakte Klassen. Es gibt in der realen Welt kein Tier, das ein allgemeines, unspezifiziertes Nutztier ist, sondern nur spezielle Unterarten von Nutztieren,

Da es umständlich ist, eine Schrift kursiv darzustellen kann man dies auch durch die Bezeichnung abstract machen:

Page 41: Abstrakte Klassen. Es gibt in der realen Welt kein Tier, das ein allgemeines, unspezifiziertes Nutztier ist, sondern nur spezielle Unterarten von Nutztieren,

Nutztier{abstract}

+ printAllAttributs(): void{abstract}

Kuh+printAllAttributs():void

Henne+printAllAttributs():void

Abstrakte Klassen und Methoden kann man auch so kennzeichnen: