You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

138 lines
4.9 KiB
Java

package com.company.lösungen;
public class gewässer {
// Öffentliche, abstrakte Klasse zur Basisimplementierung eines
// Gewässers. Die Klasse ist nicht instanziierbar; es können also
// keine Objekte dieser Klasse direkt erzeugt werden.
public abstract class Gewaesser {
// Deklaration privater Variablen
private String name;
private boolean schiffbar;
private float schadstoffbelastung;
// Öffentlicher Konstruktor, der die Angabe des Namens,
// der Schiffbarkeit sowie der Schadstoffbelastung erfordert.
public Gewaesser(
String name,
boolean schiffbar,
float schadstoffbelastung
) {
this.name = name;
this.schiffbar = schiffbar;
this.schadstoffbelastung = schadstoffbelastung;
}
// Getter-Methode zur Abfrage, in welches andere Gewässer
// dieses mündet. Diese Methode wird in ableitenden Klassen
// überschrieben.
public Gewaesser getMuendetIn() {
return null;
}
// Getter-Methode zur Rückgabe des Gewässernamens
public String getName() {
return name;
}
// Öffentliche Methode zum Generieren eines repräsentativen
// Strings.
public String toString() {
return name;
}
}
// Öffentliche Klasse, die ein Meer repräsentiert und dazu von
// der abstrakten Klasse Gewässer ableitet.
public class Meer extends Gewaesser {
// Deklaration privater Variablen
private int flaeche;
// Konstruktor, der Name, Schadstoffbelastung sowie Fläche
// einfordert
public Meer(String name, float schadstoffbelastung, int flaeche) {
// und damit den Konstruktor der Basisklasse (Gewaesser) aufruft.
// Da ein Meer immer schiffbar ist, wird beim Aufruf des Basisklassen-
// konstruktors für schiffbar direkt der Wert 'true' gesetzt.
super(name, true, schadstoffbelastung);
// und zusätzlich noch die Fläche in der selbst erzeugten Variablen
// speichert. Denn die Basisklasse hat hierfür keine Variable vor-
// gesehen.
this.flaeche = flaeche;
}
}
// Klasse, die einen Fluss repräsentiert und von der Klasse Gewaesser
// ableitet.
public class Fluss extends Gewaesser {
// Deklaration privater Variablen, die typisch für einen
// Fluss sind
private int laenge;
private Gewaesser muendetIn;
// Öffentlicher Konstruktor, der die benötigten Werte
// entgegennimmt. Ein Fluss mündet in einem anderen
// Gewässer und wird zusätzlich verlangt.
public Fluss(
String name,
boolean schiffbar,
float schadstoffbelastung,
int laenge,
Gewaesser muendetIn
) {
// Aufruf und Übergabe der Werte an den Konstruktor der
// Basisklasse Gewaesser
super(name, schiffbar, schadstoffbelastung);
// Speichern der zusätzlichen Parameter, die für einen
// Fluss charakteristisch sind.
this.laenge = laenge;
this.muendetIn = muendetIn;
}
// Öffentliche Methode, um das nächste erreichbare Meer
// zu bestimmen.
public Gewaesser bestimmeMeer() {
// Gehe ins nächste Gewässer
Gewaesser gewaesser = this.muendetIn;
// Solange wir noch weitere Gewässer haben,
while (gewaesser.getMuendetIn() != null) {
// gehe Gewässerkette solange durch, bis wir auf Meer stoßen
// (also kein muendetIn mehr vorhanden ist)
gewaesser = gewaesser.getMuendetIn();
}
return gewaesser;
}
// Überschreiben der Basisklassenmethode, die
// hier aber einen konkreten Wert zurückliefert
public Gewaesser getMuendetIn() {
return muendetIn;
}
// Öffentliche Methode zur Repräsentation eines Flusses
public String toString() {
return super.name + ", mündet in " + getMuendetIn().getName() + ", endet" +
" in " + bestimmeMeer();
}
}
// Startpunkt des Hauptprogramms
// Hier werden die implementierten Klassen zu Demonstrations- und
// Testzwecken instanziiert und verwendet.
public void setup() {
Meer nordsee = new Meer("Nordsee", 12.2f, 842000);
Fluss elbe = new Fluss("Elbe", true, 12.3f, 1094, nordsee);
Fluss moldau = new Fluss("Moldau", true, 12.3f, 430, elbe);
Fluss berounka = new Fluss("Berounka", false, 12.3f, 138, moldau);
Fluss havel = new Fluss("Havel", true, 12.3f, 334, elbe);
System.out.println(berounka);
System.out.println(moldau);
System.out.println(havel);
}
}