Abstrakte Klassen.

Slides:



Advertisements
Ähnliche Präsentationen
der Universität Oldenburg
Advertisements

der Universität Oldenburg
der Universität Oldenburg
DVG Einfache Klassen Einfache Klassen. DVG Einfache Klassen 2 Strukturen Beispiel: Personendaten bestehen aus –String name –String vorname.
Kritische Betrachtung
Java: Objektorientierte Programmierung
Indirekte Adressierung
Java: Referenzen und Zeichenketten
Java: Grundlagen der Objektorientierung
Vererbung.
Klassenvariable (auch Klassendaten bzw. statische Attribute genannt) und statische Methoden.
Ein Beispiel in Java.
Erweiterte Zuweisungskompatibilität
Klassenvariable. Da man für jede Kuh bzw. jede Henne auf dem Markt den gleichen Preis für ein Liter Milch, bzw. den gleichen Preis für ein Ei bekommt,
Konstruktoren.
Objekte werden als Adressen (Referenzen) übergeben. Dies führt manchmal zu unerwarteten Ergebnissen...
Assoziationen (Beziehungen) 1 : n. Zu einem Auto gibt es mehrere Fahrer (2) und zu diesen 2 Fahrern gibt es genau dieses Auto.
Vererbung. Das Prinzip der Vererbung im täglichen Leben:
Polymorphie (Vielgestaltigkeit)
Assoziationen (Beziehungen). Zwischen Objekten kann es eine Beziehung geben.
Polymorphie (Vielgestaltigkeit)
Objekte und Arbeitsspeicher
Interface bzw. Schnittstelle anschaulich: Hüllenklasse
FOR Anweisung. Aufgabe : Ausgabe aller ganzen Zahlen von 0 bis 100 auf dem Bildschirm.
Programmieren mit JAVA
Programmieren mit JAVA
Vererbung Spezialisierung von Klassen in JAVA möglich durch
PKJ 2005/1 Stefan Dissmann Ausblick Es fehlen noch: Möglichkeiten zum Strukturieren größerer Programme Umgang mit variabler Zahl von Elementen Umgang mit.
Zusammenfassung Vorwoche
PKJ 2005/1 Stefan Dissmann Klassenhierarchie Person Kunde Goldkunde Lieferant Object.
Abstrakte Klassen DVG
DVG Interfaces. DVG mehrfache Vererbung 4 Mehrfache Vererbung ist die Ableitung einer Klassen von mehreren anderen Klassen. –farbigerPunkt.
DVG Einführung in Java1 Einführung in JAVA.
07-GraphischeObjekte Graphische Objekte in EMMA301Paint.
Abstrakte Klassen, Interface
DVG Klassen und Objekte
DVG Einfache Klassen 1 Einfache Klassen. 2DVG Einfache KlassenStrukturen Beispiel: Personendaten bestehen aus String name String name.
EDV Parallelprogrammierung1 Parallelprogrammierung mit JAVA.
Klassen 02 - Klassen.
Vererbung Einfache Vererbung – Erben von abstrakten Klassen – Implementieren eines Interfaces.
Seite 1 Interface - Konzept Ein Interface führt einen neuen Datentyp ein: interface Frau {... } Das Interface enthält Deklarationen ( keine Definitionen.
Entwurfs- und Implementationsdiagramme
CuP - Java Elfte Vorlesung Montag, 11. November 2002.
Javakurs FSS 2012 Lehrstuhl Stuckenschmidt
OOP-Begriffe Abstraktion Modellieren Klasse Objekt Attribute Methoden
Unterprogramme in JAVA
EPROG Tutorium #5 Philipp Effenberger
Programmiervorkurs WS 2014/15 Instanzmethoden
Polymorphie (Vielgestaltigkeit). Wenn eine Methode, wie z.B. print für verschiedene Programmteile steht (und z.B. einmal Objekte verschiedener Klassen.
Informatik I : Software höhere Programmiersprachen Java Klassen: hat Methoden (Funktionen) und Daten (Variablen) es kann mehrere Klassen geben nur eine.
OOP-Begriffe Abstraktion Modellieren Klasse Objekt Attribute Methoden
Java-Kurs Übung Besprechung der Hausaufgabe Vererbung
Java-Kurs - 5. Übung Besprechung der Übungsaufgabe Klassen und Objekte
Java-Kurs Übung Besprechung der Hausaufgabe Vererbung
Einführung in die Programmierung mit Java
Abstrakte Klassen und das Interface-Konzept
Objektorientierte Programmierung (OOP)
Funktionen, Felder und Parameter- übergabe. Funktionsaufruf mit Feld als Parameter: Parameter = Name des Feldes.
Java Programme nur ein bisschen objektorientiert.
Tutorium Software-Engineering SS14 Florian Manghofer.
Vererbung in Java. public abstract class Form { protected int breite; protected int hoehe; protected String farbe; /** * Erzeuge eine Form der Breite.
Klassenvariable.
Konstruktoren.
Vererbung.
Venusspiegel und Marsschild
Java-Kurs Übung Klassen und Objekte: Vererbung (Fortsetzung)
Es gibt Klassen, die mit der Entwicklungsumgebung ausgeliefert werden
2. Vererbung und Kapselung
1. Die rekursive Datenstruktur Liste 1
Implementieren von Klassen
 Präsentation transkript:

Abstrakte Klassen

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.

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.

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

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:

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

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.

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.

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:

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

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

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

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.

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

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

Bemerkung:

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

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

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

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.

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

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.

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?

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.

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?

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

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.

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.

Wichtige Bemerkungen

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

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.

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

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

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;

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

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

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 ?

Abstrakte Klassen und Methoden in UML-Darstellung:

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

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

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