Seminar Java Einführung

Werbung
Markus Knauer
Wera AG
Seminar Java
25.10.01
Seminar Java Einführung
Aufgaben 2. Woche
Das einführende Beispiel schlechthin für die objektorientierte Programmierung sind geometrische
Körper; diese sollen nun in einer Klassenhierarchie abgebildet werden und mit einem kleinen
Testprogramm anschaulich zu testen sein.
Hier geht es um die Körper Quader, Zylinder, Pyramide und Kegel. Jeder dieser verschiedenen Körper
besitzt Eigenschaften (Attribute) wie Höhe, Radius, Breite oder Länge, welche ihn genau beschreiben.
Aus diesen Daten ist es dann möglich, die Daten wie Grundfläche, Oberfläche und Volumen zu
errechnen.
Ein herkömmlicher prozeduraler Programmieransatz wäre gewesen, für jede Möglichkeit die
entsprechende Funktion zu schreiben. Zum Beispiel:
public static double berechneQuaderVolumen( double hoehe,
double breite,
double laenge ) {
return ( hoehe * breite * laenge );
}
Im Hauptprogramm main hätte man dann vielleicht folgende Zeilen finden können:
double breite = 10.0;
double laenge = 5.0;
double hoehe = 3.0;
double volumen = berechneQuaderVolumen( hoehe, breite, laenge );
Diese Methode hat jedoch den Nachteil, dass sie sehr starr und unflexibel ist, sobald man neue
Körper einführen will, denn man muss fast alles neu programmieren. Zum anderen sind die Daten
nicht „geschützt“ – man denke an die drei offenliegenden Variablen breite, laenge und hoehe.
Diese sind frei veränderbar und es ist nicht erkennbar, ob sie für einen Quader oder für eine Pyramide
gelten.
Diese Nachteile versucht man mit einem objektorientierten Ansatz zu vermeiden, indem die
geometrischen Objekte in Computerobjekte überführt und in Form von Klassen allgemein
programmiert werden. Wenn man nun versucht, in den oben beschriebenen geometrischen Objekten
Gemeinsamkeiten zu finden, so stellt man fest, dass man Kegel und Pyramide zu Spitzkörpern
zusammenfassen kann. Ebenso wollen wir hier Quader und Zylinder zu Säulen zusammenfassen.
(Übrigens wären auch andere Ansätze denkbar, z.B. die Ordnung nach kreisförmigen oder
rechteckigen Grundflächen der Körper.)
Der allen Objekten gemeinsame Oberbegriff ist Körper, so dass also die folgenden generalisierenden
Beziehungen bestehen (Vererbung!):
Ein Quader ist-eine Säule ist-ein Körper
Eine Pyramide ist-ein Spitzköper ist-ein Körper
u.s.w.
Halten wir also fest: Um unsere geometrischen Objekte für den Computer zu modellieren, benötigen
wir eine allen gemeinsame Basisklasse Koerper und zwei davon abgeleitete Klassen
Spitzkoerper und Saeule, welche wiederum Basisklassen für die abgeleiteten Klassen Kegel,
Pyramide, Quader und Zylinder sind.
Versuchen wir nun, die oben genannten Attribute und Methoden günstig auf unsere Objekte zu
verteilen.
•
•
Alle Körper haben die gleiche Eigenschaft Höhe. Das Attribut hoehe sollte also nur in
Koerper implementiert werden und vererbt sich an alle abgeleiteten Klassen.
Zur Berechnung brauchen wir noch je nach geometrischem Körper den radius oder die
Kombination aus laenge und breite. Diese Attribute unterscheiden sich von
geometrischem Körper zu Körper und müssen in den vier Klassen Zylinder, Quader, ...
enthalten sein.
Seite 1 von 2
Markus Knauer
•
•
Wera AG
Seminar Java
25.10.01
Die Berechnung des Volumens ist für die Säulen Quader und Zylinder gleich. Ebenso
gleich ist es bei den Spitzkörpern, so dass die Volumenberechnung in den Klassen Saeule
und Spitzkoerper erfolgen sollte.
Die Methoden zur Berechnung der Grundfläche und der Oberfläche sehen wir hier als
Spezifika der Klassen Pyramide, Kegel, Quader und Zylinder und implementieren sie
auch in diesen Klassen.
Klasse
Attribute
Koerper
hoehe
Spitzkoerper
Saeule
Pyramide
breite, laenge
Formeln (GF: Grundfläche, OF: Oberfläche, L: Länge, H: Höhe, ...)
Volumen = 1/3 * Grundfläche * Höhe
Volumen = Grundfläche * Höhe
GF = L * B
2
2
OF = GF + B H + L
4
Kegel
radius
GF = π * R²
OF = GF + πR R 2 + H 2
Quader
Zylinder
breite, laenge
radius
GF = L * B
GF = π * R²
OF = 2 * (GF + L*H + B*H)
OF = 2 * GF + 2 * pi * R * H
Aufgabe
+L H2 +B
2
4
(15 Punkte)
Schreiben Sie die 7 Klassen nach den Angaben aus dem Text, so dass folgendes Testprogramm
lauffähig ist (zu finden als Sourcedatei auch im Internet unter www.home.fh-karlsruhe.de/~knma0020)
public class Test {
public static void printKoerper( Koerper einKoerper )
{
System.out.println( "Hoehe:
" + einKoerper.getHoehe() );
System.out.println( "Grundflaeche: " + einKoerper.getGrundflaeche() );
System.out.println( "Oberflaeche: " + einKoerper.getOberflaeche() );
System.out.println( "Volumen:
" + einKoerper.getVolumen() );
}
public static void main( String args[] ) {
Zylinder Z = new Zylinder(); Kegel
K = new Kegel();
Quader
Q = new Quader();
Pyramide P = new Pyramide();
Z.setHoehe( 10.0 );
Q.setHoehe( 30.0 );
K.setHoehe( 20.0 );
P.setHoehe( 40.0 );
Z.setRadius( 5.0 );
K.setRadius( 5.0 );
Q.setBreite( 5.0 );
P.setBreite( 5.0 );
Q.setLaenge( 10.0 );
P.setLaenge( 10.0 );
printKoerper( Z );
printKoerper( Q );
printKoerper( K );
printKoerper( P );
}
}
Implementieren Sie also in Ihren Klassen alle Attribute (Variablen) private und schreiben Sie die
passenden Zugriffsmethoden setHoehe, getHoehe, setBreite, getBreite, usw. zum Setzen
und Lesen der Attribute.
Lesen Sie nach, was das Wort abstract im Zusammenhang mit Klassen und Methoden bedeutet.
Bei welchen Klassen und bei welchen Methoden benötigen Sie es? Welche Methoden in der Klasse
Koerper müssen Sie abstract deklarieren?
Zusatzaufgabe
(10 Punkte)
Erweitern Sie Ihre Klassen um geeignete Konstruktoren, welche als Parameter Werte bekommen, mit
denen sie die Attribute hoehe, radius, breite und laenge initialisieren. Was können Sie mit dem
Schlüsselwort super erreichen und wo benötigen Sie es?
Schreiben Sie eine Methode print(), die zu jedem Objekt den Klassennamen, die Werte der
Attribute und die errechneten Größen Volumen, Grundfläche und Volumen auf den Bildschirm
schreibt.
Seite 2 von 2
Herunterladen