erstellt 24.09.99; kleinere Änderung 04.05.00; übersetzt 21.05.03; überarbeitet 15.12.03, 19.07.04, 19.10.06, 10.01.11, 05.12.17, 19.06.18, 06.05.2019, 29.11.21, 16.06.22; Deutsche Übersetzung Heinrich Gailer
Wir implementieren eine Klasse Box
, ähnlich wie in der vorherigen Testaufgabe. Aber die neue Implementierung von Box
wird eine bessere Kapselung haben.
Hier ist die Dokumentation für Box
:
class BoxEine Klasse, die eine Box implementiert.
Konstruktoren
Box ( double breite, double hoehe, double laenge )
Box ( double seite )
Methoden
double berechneVolumen( )
double berechneOberflaeche( )
Wir verwenden als Ausgangsbasis das Beispiel des vorherigen Tests, das für diese und die nächsten Übungen leicht modifiziert werden kann.
Wir deklarieren in der jetzigen Implementierung von Box
alle Instanzvariablen als private
.
Das bedeutet, dass nur die Methoden eines Box
-Objekts dessen Objektdaten sehen können. Das Objekt wird unveränderbar sein, wenn es keine Zugriffsmethoden gibt, die die Daten ändern. Ein unveränderbares Objekt ist ein Objekt, dessen Daten sich nicht ändern.
Ihr erinnert Euch vielleicht daran, dass Stringobjekte unveränderbar sind — sobald die Zeichen des Strings mit dem Konstruktor gesetzt worden sind, werden sie sich niemals ändern (obwohl sie für die Erzeugung anderer Stringobjekte verwendet werden können.) Es gibt viele Vorteile in der Verwendung unveränderbarer Objekte, besonders in der Programmierung mit Threads (mit Threads werden fast alle umfangreichen Programme geschrieben).
Wir geben auf die Methoden von Box
öffentlichen (public
) Zugriff.
Dann testen wir die Box
-Klasse mit verschiedenen Versionen dieses Programms:
class BoxTester { public static void main ( String[] args ) { Box box = new Box( 2.5, 5.0, 6.0 ) ; System.out.println( "Flaeche: " + box.berechneOberflaeche( ) + " Volumen: " + box. berechneVolumen( ) ); System.out.println( "Laenge: " + box.laenge + " Hoehe: " + box. hoehe + "Breite: " + box.breite ) ; } }
(Das obenstehende Programm wird, so wie wir es wollten, nicht kompilieren. Wir überlegen warum es nicht kompiliert werden kann und bessern es aus, so dass es sich kompilieren lässt.)
Zurück zum Inhaltsverzeichnis.
Box
Die Implementierung von berechneOberflaeche( )
, wie sie in der vorherigen Testaufgabe gegeben wurde, ist wahrscheinlich vernünftig für die Box
-Klasse.
Aber, um private Methoden zu üben schreiben wir wie folgt:
double berechneOberflaeche( ) { return 2 * berechneOberflaecheVorn() + 2 * berechneOberflaecheOben() + 2 * berechneOberflaecheSeitlich() ; }
Dabei sind
berechneOberflaecheVorn()
,
berechneOberflaecheOben()
und
berechneOberflaecheSeitlich()
private Methoden, um die Fläche der vorderen, der oberen und der seitlichen Seite der Box zu berechnen.
Wir müssen sie unserer Klasse hinzufügen.
Private Methoden sind oft "Hilfsmethoden", die von den öffentlichen Methoden
verwendet werden, aber nicht von außerhalb der Klasse verwendet werden können.
Wir testen das Programm mit verschiedenen Versionen des folgenden:
class BoxTester { public static void main ( String[] args ) { Box box = new Box( 2.5, 5.0, 6.0 ) ; System.out.println( "Flaeche: " + box.berechneOberflaeche( ) + " volumen: " + box. berechneVolumen( ) ); System.out.println( "Flaeche oben: " + box.berechneOberflaecheOben() ); } }
(Das obenstehende Programm wird, wie erwartet, nicht kompilieren.)
Zurück zum Inhaltsverzeichnis.
Wir fügen der Box
-Klasse einen neuen Konstruktor hinzu:
Box( Box alteBox )
Der Konstruktor erzeugt ein neues Box
-Objekt mit genau den gleichen Dimensionen des übergebenen Box
-Objekts alteBox
.
Natürlich wird das alte Objekt nicht verändert.
Wir fügen jetzt einige Zugriffsmethoden hinzu. Eine Zugriffsmethode ist eine Methode, die verwendet werden kann, um auf private Variablen (und andere Variablen) eines Objekts zuzugreifen:
public double getLaenge() public double getHoehe() public double getBreite()
Jede dieser Methoden gibt bloß den Wert einer Instanzvariablen zurück. Da das Objekt unveränderbar ist, gibt es keine Zugriffsmethode, um die Instanzvariablen zu ändern. Wir testen das Programm mit der geänderten Testklasse der vorherigen Aufgabe.
Zurück zum Inhaltsverzeichnis.
Es wäre schön eine Box zu erzeugen, die größer ist als eine gegebene Box. Wir schreiben diese Methode:
public Box groessereBox()
Das ist eine öffentliche Methode, die eine Referenz auf ein neues Box
-Objekt zurückgibt. Die neue Box
wird in jeder Dimension 25% größer sein als die alte Box.
public Box groessereBox() { // do stuff }
Wir schreiben jetzt eine Methode, die eine Box zurückgibt, die in jeder Dimension 25% kleiner ist als eine gegebene Box.
Wir schreiben wie üblich ein Testprogramm, um die Klasse zu testen.
Zurück zum Inhaltsverzeichnis.
Wir schreiben eine Methode, die true
oder false
ergibt,
je nach dem ob eine Box vollständig in eine andere Box passt:
public boolean passtIn( Box aeussereBox )
Dies ist möglicherweise eine schwierige Methode, da
die innere Box hineinpassen oder nicht hineinpassen kann,
je nach dem wie sie gedreht wird.
Um die Methode zu vereinfachen, schreiben wir sie so, dass sie true
zurückgibt, wenn zwei Boxen ohne Rotation ineinander geschachtelt werden können (Höhe wird mit Höhe verglichen, Länge mit Länge usw.).
Zurück zum Inhaltsverzeichnis.
Wenn das ein Auftrag für eine regelgerechte Klasse wäre, würden wir aufgefordert werden das Folgende abzuliefern:
Die Zusammenstellung des abzuliefernden Materials ist häufig ein substantieller Teil der Arbeit. Das ist gute Praxis für die realen Aufgaben.
Zurück zum Inhaltsverzeichnis.
Ende der Aufgaben.