Die Präsentation wird geladen. Bitte warten

Die Präsentation wird geladen. Bitte warten

Abstrakte Klassen.

Ähnliche Präsentationen


Präsentation zum Thema: "Abstrakte Klassen."—  Präsentation transkript:

1 Abstrakte Klassen

2 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.

3 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.

4 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).

5 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:

6 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(...)

7 Eine Oberklasse wie z. B. Nutztier kann einer Unterklasse wie z. B
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.

8 Eine abstrakte Methode in der Oberklasse Nutztier, wie z. B
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.

9 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:

10 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!!! }

11 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. }

12 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()); }

13 class Henne extends Nutztier { private int legeLeistung;
} public Henne(String pName, int plegeLeistung){ super(pName); legeLeistung = plegeLeistung; } public double getTierwert(){ return(2 * legeLeistung); } Implementieren Sie einen Konstruktor mit 2 Parametern. Der Marktwert einer Henne berechnet sich aus dem doppelten Wert der Legeleistung. Implementieren Sie die Methode getTierwert() in der Klasse Henne.

14 class Kuh extends Nutztier{ private double milchLeistung;
} public Kuh(String pName, double pMilchLeistung){ super(pName); milchLeistung=pMilchLeistung; } public double getTierwert(){ return(10 * milchLeistung); } Implementieren Sie einen Konstruktor mit 2 Parametern. Der Marktwert einer Kuh berechnet sich aus dem zehnfachen Wert der Milchleistung. Implementieren Sie die Methode getTierwert() in der Klasse Kuh. Der Marktwert einer Henne berechnet sich aus dem doppelten Wert der Legeleistung. Implementieren Sie diese Methode

15 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(); } w1 = 10 *100 = 1000 w2 = 2 *1 = 2 w3 = 0,1 * 1000 = 100 Welche Werte haben w1, w2, w3, w4 ? w4 = 0,1 * 2 = 0,2

16 Bemerkung:

17 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: }

18 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: }

19 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. }

20 Was soll das mit den abstrakten Methoden
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.

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

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

23 public Nutztier(String pName){ name = pName; }
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?

24 public Nutztier(String pName){ name = pName; }
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.

25 public Nutztier(String pName){ name = pName; }
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?

26 public class MainAbstrakt{ public static void main( String[] args){
Aus der Methode in der Oberklasse, also aus getTierwert () in der Klasse Nutztier. Diese liefert immer den Wert 123 zurück! 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(); } w1 = 123 w2 = 123 getTierwert() gibt es nicht mehr in Kuh und Henne. Wo holt sich der Compiler dann diese Methode? w3 = 0,1 * 123 = 12,3 w4 = 0,1 * 123 = 12,3

27 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.

28 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.

29 Wichtige Bemerkungen

30 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).

31 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.

32 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).

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

34 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;

35 public void setBreite(
double pBreite){ breite = pBreite; } public double getLaenge(){ return(laenge); public double getBreite(){ return(breite); public double getFlaecheninhalt(){ return(laenge * breite);

36 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);

37 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 ?

38 Abstrakte Klassen und Methoden in UML-Darstellung:

39 Nutztier Kuh Henne + printAllAttributs(): void
Abstrakte Klassen und Methoden werden durch eine kursive Schreibweise gekennzeichnet. Kuh +printAllAttributs():void Henne +printAllAttributs():void

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

41 Nutztier {abstract} Kuh Henne
+ printAllAttributs(): void {abstract} Abstrakte Klassen und Methoden kann man auch so kennzeichnen: Kuh +printAllAttributs():void Henne +printAllAttributs():void


Herunterladen ppt "Abstrakte Klassen."

Ähnliche Präsentationen


Google-Anzeigen