Interface Verständnisproblem bezüglich Interfaces

mar71n

Neues Mitglied
Als Aufgabe gilt es eine abstrakte Klasse Fahrzeug zu erstellen, von der dann jeweils die Klasse LKW und PKW erben.

Dann müssen wir ein Interface FahrzeugDAO mit einigen Methoden machen, welche wiederum in der Klasse SerializedFahrzeugDAO beschrieben werden.

z.B
loescheFahrzeug(Fahrzeug f);
aktualisiereFahrzeug(Fahrzeug f);
...

Was ich hierbei nicht verstehe: In der Klasse SerializedFahrzeugDAO müsste ich doch Objekte der Klasse Fahrzeug erzeugen, was aber wiederum nicht geht, da diese Klasse doch abstract ist, oder?
Hier noch die gesamte Aufgabenstellung um Unklarheiten auszuschließen.




// Aufgabenstellung:
Einzelaufgabe "Fahrzeugverwaltung"
1. Abstrakte Klasse Fahrzeug

Implementieren Sie eine abstrakte Klasse Fahrzeug. Diese Klasse dient zum Speichern von Informationen über Fahrzeuge.
Dabei sollen folgende Daten als private Instanzvariablen erfasst und dafür öffentliche Zugriffsmethoden (set… und get…) erstellt werden:


Marke
Modell
Baujahr
Leistung (PS)
Kilometerstand
Grundpreis (Euro)
Id (Fahrzeugnummer)
Überprüfungsdatum (Datum der letzten Überprüfung)
Überprüfungsintervall (in Jahren)

Wählen Sie passende Datentypen.

Es soll ein Konstruktor implementiert werden, der es ermöglicht, die entsprechenden Instanzvariablen direkt zu setzen.

Prüfen Sie beim Eintragen von Daten, ob es sich um zulässige Werte handelt (Ausnahmen: Marke und Modell). Beachten Sie z. B., dass Baujahr und Überprüfungsdatum nicht in der Zukunft liegen sollen.

Sollten Bedingungen nicht erfüllt sein, werfen Sie jeweils eine IllegalArgumentException mit einem sinnvollen Fehlertext.

Eine Methode getAlter() soll das Alter des Fahrzeuges berechnen. Eine Methode getNaechstePruefung() soll das Datum der nächsten Überprüfung berechnen (Anhand von Überprüfungsdatum und Überprüfungsintervall).

Zusätzlich soll es eine Methode getPreis() geben, die den Preis eines Fahrzeuges auf der Basis Grundpreis minus Rabatt berechnet. Zu diesem Zweck soll eine abstrakte Methode getRabatt() zur Klasse Fahrzeug hinzugefügt und innerhalb von getPreis() verwendet werden.

2. Klassen PKW und LKW

Es sollen zwei konkrete (nicht-abstrakte) Unterklassen PKW und LKW von der abstrakten Klasse Fahrzeug abgeleitet werden. Die Klasse PKW hat eine zusätzliche Instanzvariable für Ausstattungspakete sowie entsprechende Zugriffsmethoden. Die Namen (String) der Ausstattungspakete sollen in einer Liste gespeichert werden.

Beide Klassen sollen die Methode getRabatt() implementieren: für einen LKW erhält man einen Rabatt, der vom Fahrzeugalter abhängt (pro Jahr einen Rabatt von 5%), während man für einen PKW einen Rabatt abhhänging vom Fahrzeugalter und von zusätzlichen Ausstattungspaketen bekommt (pro Jahr einen Grundrabatt von 10% minus 1% pro Ausstattungspaket, bis zu einem Maximum von 5 Ausstattungspaketen). Der maximal mögliche Rabatt beträgt für PKW 95% und für LKW 90% des Grundpreises.

Eine Methode toString() soll alle Fahrzeugdaten als String zurückzugeben.

Platzieren Sie die Klassen Fahrzeug, LKW und PKW in einem Package swe2014.fm.fahrzeuge .

3. Interface FahrzeugDAO

Dieses Interface definiert Methoden des Entwurfsmusters Data Access Object (DAO, engl. für Datenzugriffsobjekt) zur Erstellung persistenter Fahrzeugobjekte. Dieses Muster ermöglicht es, auf Daten unabhängig von der Art der benutzten Datenquelle zuzugreifen («weitere Information und ein konkretes Beispiel»).

Das Interface FahrzeugDAO soll folgende generische Methoden zum Einlesen und Speichern von Fahrzeugobjekten deklarieren.

Die Methode getFahrzeugList() soll eine Liste (z. B. java.util.ArrayList) benutzen, um alle persistent gespeicherten Fahrzeugobjekte zurückzugeben.

Die Methode getFahrzeugbyId(… id) soll, anhand der Fahrzeugnummer, ein Fahrzeug-Objekt zurückgeben. Falls das Fahrzeug nicht gefunden wird, soll die Methode null zurückgeben.

Die Methode speichereFahrzeug(Fahrzeug …) soll ein Fahrzeugobjekt persistent speichern. Stellen Sie sicher, dass beim Speichern eines neuen Fahrzeuges nicht die Fahrzeugnummer eines bereits gespeicherten Fahrzeug verwendet wird. Werfen Sie in diesem Fall eine IllegalArgumentException mit einer entsprechenden Fehlermeldung.

Die Methode loescheFahrzeug(Fahrzeug …) soll ein bestehendes Fahrzeug von der persistenten Datenquelle löschen. Falls es kein solches Fahrzeug gibt, soll IllegalArgumentException (mit entsprechender Fehlermeldung) geworfen werden.

Die Methode aktualisiereFahrzeug(Fahrzeug …) soll die Daten eines bestehenden Fahrzeug ändern. Dabei soll sie das Fahrzeug-Objekt suchen, in dem die Fahrzeugnummer den selben Wert besitzt wie im übergebenen Fahrzeug-Objekt. Auch diese Methode soll IllegalArgumentException werfen, falls das Fahrzeug nicht existiert.

4. Klasse SerializedFahrzeugDAO

Die Klasse SerializedFahrzeugDAO implementiert das Interface FahrzeugDAO.

Benutzen Sie zur persistenten Speicherung in SerializedFahrzeugDAO die Java-Standardserialisierung.

Der Klasse soll im Konstruktor ein String übergeben werden, der den Dateinamen bzw. Pfad der Datenquelle(n) enthält.

Achten Sie darauf, dass in Methoden, die in eine Datei schreiben, alle Instanzvariablen der Fahrzeugobjekte gesetzt bzw. nicht leer sind. Falls ein Wert fehlt, soll eine entsprechende IllegalArgumentException geworfen werden. Alle weiteren (nicht applikationsspezifischen) Systemfehler, z. B. Fehler aus Dateioperationen, sollen abgefangen und auf der Systemkonsole protokolliert werden (sie müssen nicht weitergeleitet werden).

Platzieren Sie das Interface FahrzeugDAO sowie die Klasse SerializedFahrzeugDAO in einem Package swe2014.fm.fahrzeuge.dao .
 

Admiral Helmut

Aktives Mitglied
Du musst in der Klasse SerializedFahrzeugDAO Objekte der konkreten Klassen erzeugen und diese Serialisieren. Also implementierst du in SerializedFahrzeugDAO die vom Interface geforderten Methoden, wie zum Beispiel "speichereNeuesFahrzeug" (nur Beispiel).
Der Sinn der abstrakten Klasse ist, beide Typen der Fahrzeuge anzusprechen und mit der gleichen Methode serialisieren zu können. also sie als Objekte vom Typ Fahrzeug zubehandeln, obwohl sie konkrete abgeleitete Klassen sind. Dadruch kannst du sie in der gleichen Liste oder gleichen Methode behandeln

Java:
public void speicherNeuesFahrzeug(Typ i){
	
	if(i==LKW){
		Fahrzeug f = new LKW();
		serialize(f);
	}else if(i==PKW){
		Fahrzeug t = new PKW();
		serialize(t);
	}
}

Achtung kein richtiger code

hoffe ich konnte helfen

Gruß Helmut
 

Joose

Top Contributor
In diesem Fall würde ich das "SerializedFahrzeugDAO" ebenfalls abstrakt halten und 2 Unterklassen "SerializedLkwDao" und "SerializedPkwDao" erstellen welche die jeweilige Objekte serialisieren/deserialisieren.

Gemeinsamkeiten etc. kann man natürlich in der Basisklasse "SerializedFahrzeugDAO" definieren/deklarieren etc.

@Admiral Helmut
Achtung: Das Interface schreibt vor das die Methdoe "speichereFahrzeug" ein Objekt vom Typ Fahrzeug übergeben bekommt. Sprich es wird schon ein konkretes Objekt übergeben.
 
Zuletzt bearbeitet:

Admiral Helmut

Aktives Mitglied
Beziehungsweise habe gerade gesehen dass eure speichereFahrzeug Methode schon ein konkretes Objekt erwartet.
Also muss diese Typ Prüfung und Objekterstellung an anderer Stelle. Wohl in die Main Methode, welche das ganze auf der Console oder so steuert.

Das wichtige ist, dass du hinter einem Fahrzeugobjekt ein konkretes Objekt erzeugt:

Fahrzeug f = new LKW();
speicherFahrzeug(f);
 

mar71n

Neues Mitglied
Danke soweit, mal sehen ob mich diese Hilfe weiterbringt...
Bin etwas überfordert mit dieser Hausübung, denn es ist unsere erste Java-Aufgabe.
Davor wurde lediglich c++ gemacht.
 

Neue Themen


Oben