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