Ich habe ein Programm, in dem es um verschiedene Klassen von Fahrzeugen geht. Die Fahrzeug-Klassen haben unterschiedliche Parameter und Methoden.
Der User soll entscheiden können, welche Methoden er benutzen will. Er kann bspw. neue Fahrzeuge generieren, diese auftanken, etc. Die Abfragen ("Wie heisst das neue Auto?" etc) laufen über Methoden.
Ich bin unschlüssig, in welcher Klasse ich diese Methoden definieren soll:
Puh, je mehr ich schreibe, desto verworrener wird's....
Danke trotzdem
Der User soll entscheiden können, welche Methoden er benutzen will. Er kann bspw. neue Fahrzeuge generieren, diese auftanken, etc. Die Abfragen ("Wie heisst das neue Auto?" etc) laufen über Methoden.
Ich bin unschlüssig, in welcher Klasse ich diese Methoden definieren soll:
- in eine der Fahrzeug-spezifischen Klassen (Benziner, Fahrrad, etc.) macht mE kaum Sinn. Wenn das Programm bspw. fragen soll, was des Users nächster Schritt ist, hat das nur indirekt mit dem Objekten zu tun. Die Objekte bestimmen lediglich, welche Methoden "im Angebot" sind, also woraus der User überhaupt auswählen kann. (Gegenwärtig ist aber die range an Optionen von mir statisch festgelegt.)
- in ein interface macht mE gar keinen Sinn. Interfaces nutze ich, um Aspekte abzubilden, die nicht so richtig in übrige Klassenhierarchie passen. Wenn ich bspw. irgendwas mit C02-Ausstoss implementieren will, passt das zu Benziner, aber nicht zu Fahrrad. Da würd' ich also interfaces nutzen, um damit alle Benziner zu irgendwelchen CO2-Methoden zu zwingen.
- In der main-Klasse ist es zwar einigermassen sinnvoll, aber ich finde es "unästhetisch". Ich nutze die main am Liebsten nur, um alle meine anderen Sachen aufzurufen. So ein bisschen wie die Kommandozeile des terminals. Die soll auch einigermassen "rein" bleiben.
- Soll ich eine Klasse nur für solche Meta-Methoden machen? Mit Meta-Methoden meine ich Methoden, die selber nichts tun (keine Objekte instanziieren oder verändern), sondern nur den User fragen und dann die Methoden der passenden Klassen aufrufen.
Puh, je mehr ich schreibe, desto verworrener wird's....
Danke trotzdem
Java:
import java.util.*;
public class kapitel13a3 {
public static void main(String[] args) {
Auto a1 = new Auto("Audi", "quattro", 12500, 4, 150, 210, 60, 4, 5);
LKW l1 = new LKW("Iveco", "longliner", 360000, 8, 300, 90, 250, 11, 30);
a1.allInfosAboutTHISFahrzeug();
l1.allInfosAboutTHISFahrzeug();
askUserForNextOperation ();
System.out.println("Ende des Programms");
}
public static void askUserForNextOperation () {
Scanner askUserForNextOperation = new Scanner(System.in);
int input=99;
do {
System.out.println("\nWillst du eine Funktion dieses Programms nutzen? Ja= 1, Nein=2");
input = askUserForNextOperation.nextInt();
if (input==1){
proposeOptionstoUser();
} if (input==2){
System.out.println("Gut, dann geht's zum folgenden Programmschritt.");
}
} while ((checkUserInput(2, input))==false);
}
public static void proposeOptionstoUser () {
Scanner proposeOptionstoUser = new Scanner (System.in);
int input=99;
do {
System.out.println
("\nWillst du\n1: tanken\n2: fahren\n3: ein neues Fahrzeug generieren?");
input = proposeOptionstoUser.nextInt();
System.out.println();
if (input==1){
System.out.println("Tanken wird gestartet");
//tanken (); //geht nicht weil ich gerade in einer statischen Methode bin
}
if (input==2) {
System.out.println("Fahren wird gestartet");
//fahren (); //geht nicht weil ich gerade in einer statischen Methode bin
}
if (input==3) {
System.out.println("Generieren wird gestartet");
//fahrzeugGenerieren (); //geht nicht weil ich gerade in einer statischen Methode bin
}
}
while ((checkUserInput(3, input))==false);
askUserForNextOperation();
}
//Hier wird geprüft, ob die User-Eingabe mit den Anzahl Optionen übereinstimmt
public static boolean checkUserInput (int numberOfOptions, int userChoice){
boolean userInputPossible;
if (userChoice< (numberOfOptions+1)) {
if (userChoice>0){
userInputPossible = true;
} else {
System.out.println("Der eingebene Wert ist ungueltig.");
userInputPossible = false;
}
} else {
System.out.println("Der eingebene Wert ist ungueltig.");
userInputPossible = false;
}
return userInputPossible;
}
}
abstract class Fahrzeug{
String marke, modell;
double preis;
int anzahlRaeder;
public void fahren () {}
public void allInfosAboutTHISFahrzeug (){
System.out.println(
"\nDas Modell "+modell+
" der Marke "+marke+
//Hier soll die Methode aufgerufen werden, die den ClassType bestimmt.
" ist ein "+this.getClass().getSimpleName()+
".\nEs kostet "+preis+" Franken und hat "+anzahlRaeder+" Raeder.");
}
public Fahrzeug(String marke, String modell, double preis, int anzahlRaeder) {
this.marke = marke;
this.modell = modell;
this.preis = preis;
this.anzahlRaeder = anzahlRaeder;
}
}
abstract class Benziner extends Fahrzeug{
int ps, maxGeschwindigkeit;
double verbrauchPro100k, Reichweite, aktuellerTankstand, tankSize;
final double preisProLiterBenzin = 1.55;
public double berechneKostenfuersVolltanken (){
if (aktuellerTankstand>tankSize){
System.out.println("Es kann nicht mehr Benzin im Tank sein als dessen Fassungsvermoegen.\nNaja, ich ignoriere das mal.");
}
return (tankSize-aktuellerTankstand)*preisProLiterBenzin;
}
public Benziner(String marke, String modell, double preis, int anzahlRaeder, int ps, int maxGeschwindigkeit,
double tankSize, double verbrauchPro100k) {
super(marke, modell, preis, anzahlRaeder);
this.ps = ps;
this.maxGeschwindigkeit = maxGeschwindigkeit;
this.tankSize = tankSize;
this.verbrauchPro100k = verbrauchPro100k;
Reichweite = berechneReichweite();
}
public void allInfosAboutTHISFahrzeug (){
super.allInfosAboutTHISFahrzeug();
System.out.println("Dieses Fahrzeug hat eine maximale Geschwindigkeit von "+maxGeschwindigkeit+
" kmh und eine Leistung von "+ps+" PS.\nSein Tank fasst "+tankSize+
" Liter, damit kann es bei einem Verbrauch von "+verbrauchPro100k+
" L/100km "+Reichweite+
" km weit fahren."
);
}
public double berechneReichweite (){
return Math.rint(((tankSize/verbrauchPro100k)*100));
}
}
class Auto extends Benziner {
int maxPassagiere;
public Auto(String marke, String modell, double preis, int anzahlRaeder, int ps, int maxGeschwindigkeit,
double tankSize, double verbrauchPro100k, int maxPassagiere) {
super(marke, modell, preis, anzahlRaeder, ps, maxGeschwindigkeit, tankSize, verbrauchPro100k);
this.maxPassagiere = maxPassagiere;
}
public void allInfosAboutTHISFahrzeug (){
super.allInfosAboutTHISFahrzeug();
System.out.println("Maximal "+maxPassagiere+" Passagiere passen in dieses Auto.");
}
}
class LKW extends Benziner {
int maxLadung;
public LKW(String marke, String modell, double preis, int anzahlRaeder, int ps, int maxGeschwindigkeit,
double tankSize, double verbrauchPro100k, int maxLadung) {
super(marke, modell, preis, anzahlRaeder, ps, maxGeschwindigkeit, tankSize, verbrauchPro100k);
this.maxLadung = maxLadung;
}
public void allInfosAboutTHISFahrzeug (){
super.allInfosAboutTHISFahrzeug();
System.out.println("Dieser LKW kann "+maxLadung+" Tonnen laden.");
}
}
class Fahrrad extends Fahrzeug {
double kalorienverbrauchProKm, gewicht;
int anzahlGaenge;
public void essen () {}
public Fahrrad(String marke, String modell, double preis, int anzahlRaeder, double kalorienverbrauchProKm,
double gewicht, int anzahlGaenge) {
super(marke, modell, preis, anzahlRaeder);
this.kalorienverbrauchProKm = kalorienverbrauchProKm;
this.gewicht = gewicht;
this.anzahlGaenge = anzahlGaenge;
}
}