Simulation Wettrennen mit diversen Fahrzeugen

maddin86

Mitglied
Hallo,

folgendes ist gewollt:

abstrakte Basisklasse Fahrzeug, ein Fahrzeug hat folgende Attribute: aktuelle Position (nur in einer Dimension) und aktuelle Geschwindigkeit.

Es soll die Methoden bewegen, getPosition, setzeGeschwindigkeit, maxGeschwindigkeit udn anzahlRaeder geben.

Nun sollen konkrete Fahrzeuge durch vererbung definiert werden:
Fahrrad: Fahrzeug mit 2 Rädern und max. 30 km/h
Auto: Fahrzeug mti 4 Rädern und max. 140 km/h
Rennwagen: Auto mit max. 220 km/h
Krankenwagen: Auto mit Blaulicht und Methoden zum ein/ausschalten des Blaulichts

Anschließend soll ein Wettrennen simuliert werden.

Folgendes habe ich nun geschrieben, habe jedoch noch so einige Probleme:

Java:
import EAjava.*;

abstract public class Fahrzeug
	{
	public double position, geschwindigkeit;
	
	public Fahrzeug(double pos, double geschw)
		{
		position = pos;
		geschwindigkeit = geschw;
		}
	
	public void bewege(double minuten)
		{
		position += geschwindigkeit*minuten;
		}
	
	public double getPosition()
		{
		return position;
		}
		
	public void setzeGeschwindigkeit(double g)		
		{
		if (g<0) geschwindigkeit = 0;
		else geschwindigkeit = g;
		}
	abstract public double maxGeschwindigkeit();
		{
		return maxg;
		}
		
	abstract public int anzahlRaeder();
		{
		return anzr;
		}	
	}

Java:
import EAjava.*;

public class Auto extends Fahrzeug
	{
	public int anzr;
	public double maxg;
	
	public Auto(double pos, double geschw)
		{
		super(pos,geschw);
		anzr = 4;
		maxg = 140.0;
		}
	}

Java:
import EAjava.*;

public class Fahrrad extends Fahrzeug
	{
	public int anzr;
	public double maxg;
	
	public Fahrrad(double pos, double geschw)
		{
		super(pos,geschw);
		anzr = 2;
		maxg = 30.0;
		}
	}

Java:
import EAjava.*;

public class Rennwagen extends Auto
	{
	
	public Rennwagen(double pos, double geschw)
		{
		super(pos,geschw);
		maxg = 220.0;
		}
	}

Java:
import EAjava.*;

public class Krankenwagen extends Auto
	{
	
	public boolean blaulicht;
	
	public Krankenwagen(double pos, double geschw)
		{
		super(pos,geschw);
		blaulicht = true;
		}
		
	public boolean blaulichtStatus()
		{
		return blaulicht;
		}
	
	public void blaulichtEinAus()
		{
		blaulicht =! blaulicht;
		}		
	}

Java:
import EAjava.*;

public class Wettrennen
	{
	public static void main (String args[])
		{
		Rennwagen rennwagen = new Rennwagen(0.0,200.0);
		//rennwagen.setzeGeschwindigkeit(200.0);
		Fahrrad fahrrad = new Fahrrad(0.0, 20.0);
		//fahrrad.setzeGeschwindigkeit(20.0);
		Auto auto = new Auto(0.0, 150.0);
		//auto.setzeGeschwindigkeit(150.0);
		Krankenwagen krankenwagen = new Krankenwagen(0.0,80.0);
		//krankenwagen.setzeGeschwindigkeit(80);
		
		//bewegen
		fahrrad.bewege(240.0); // 4 Std. Vorsprung
		fahrrad.bewege(60.0);
		rennwagen.bewege(60.0);
		krankenwagen.bewege(60.0);
		auto.bewege(60.0);
	
		//Positionen ausgeben
		System.out.println("Das Fahrrad ist bei Position: " + fahrrad.getPosition());
		System.out.println("Der Rennwagen ist bei Position: " + rennwagen.getPosition());
		System.out.println("Der Krankenwagen ist bei Position: " + krankenwagen.getPosition());
		System.out.println("Das Auto ist bei Position: " + auto.getPosition());
		}
	}

Beim kompilieren von Wettrennen.java erhalte ich noch einige Fehler..
 

maddin86

Mitglied
Und welche??

In der Klasse Fahrzeug sind die Variablen anzr und maxg nicht deklariert.

Fahrzeug.java:28: return outside method return maxg;

Fahrzeug.java:33: return outside method return anzr;

Auto.java:1: Auto is not abstract and does not override abstract method anzahlRaeder() in Fahrzeug public class Auto extends Fahrzeug;

Fahrrad.java:1: Fahrrad is not abstract and does not override abstract method anzahlRaeder() in Fahrzeug public class Fahrrad extends Fahrzeug;
 

Michael...

Top Contributor
Da steht doch alles drin
Du hast zwei returns ausserhalb einer Methode:
Java:
	abstract public double maxGeschwindigkeit();
		{
		return maxg;
		}
		
	abstract public int anzahlRaeder();
		{
		return anzr;
		}	
}

und Deine Klassen Fahrrad und Auto müssen die Methoden maxGeschwindigkeit und anzahlReader() implementieren, da diese in der Klasse Fahrzeug abstrakt sind.

So allgemein scheinst Du Dir nicht ganz im Klaren zu sein was Du da so anstellst ;-)
 

ARadauer

Top Contributor
Java:
abstract public double maxGeschwindigkeit();
oder
Java:
public double maxGeschwindigkeit()
        {
        return maxg;
        }
 

maddin86

Mitglied
Da steht doch alles drin
Du hast zwei returns ausserhalb einer Methode:


und Deine Klassen Fahrrad und Auto müssen die Methoden maxGeschwindigkeit und anzahlReader() implementieren, da diese in der Klasse Fahrzeug abstrakt sind.

So allgemein scheinst Du Dir nicht ganz im Klaren zu sein was Du da so anstellst ;-)

Deshalb frage ich hier ja..

Die returns außerhalbd er methode lagen an den beiden ; die ich ausversehen zu viel hatte.

Ich habe es nun wie ARadauer schreib geändert und jetzt funktioniert es.
 

Tharsonius

Bekanntes Mitglied
Vielleicht mal zur Erklärung:

Eine abstrakte Methode ist sozusagen eine art Platzhalter. Sie hat keinen Rumpf sondern besteht nur aus der einen Zeile, die dann mittels Semikolon abgeschlossen werden. Dadurch, dass eine abstrakte Methode in der Klasse ist wird zwangsläufig die komplette Klasse abstrakt.

Von einer abstrakten Klasse können keine Objekte erzeugt werden.


Eine Klasse die von abstrakten Klassen erbt übernimmt automatisch die abstrakten Methoden. Wenn diese in der abgeleiteten Klasse nun also nicht auscodiert werden bleibt diese abstrakt. In Deinem Fall willst Du aber eine konkrete Klasse haben, also eine Klasse die nicht abstrakt ist. Also musst Du den Platzhalter sozusagen ausfüllen. Dies funktioniert genaus so, als wenn Du ein Interface einbindest (bsp. WindowListener, ActionListener), diese sind auch abstrakt und müssen halt implementiert werden, damit sie genutzt werden können.
 

ludden

Mitglied
Hei,
hab genau die gleiche Aufgabe gelöst vor einer Woche für die Uni. Bist nicht zufällig an der TU Kaiserslautern? Kann sie dir geben, wenn du nicht fertig wirst oder vergleichen willst.
 

maddin86

Mitglied
@Tharsonius: Danke für die Erklärung! :)

Hei,
hab genau die gleiche Aufgabe gelöst vor einer Woche für die Uni. Bist nicht zufällig an der TU Kaiserslautern? Kann sie dir geben, wenn du nicht fertig wirst oder vergleichen willst.

Ja, genau ^^

Aber wie gesagt, hab es ja nun hinbekommen.

Deiner Version kannst du hier ja evtl. trotzdem mal einstellen?
 

ludden

Mitglied
Jo kann ich mal machen. Ist aber ähnlich:
Fahrzeug.class
Java:
abstract public class Fahrzeug
{
  //Attribute
  public double position;
  public double Geschwindigkeit;
  //Konstructoren
  Fahrzeug(double position)
  {
    this.position = position;
  }

  //Methoden
  public double  getPosition()
  {
    return position;

  }

  public double bewege(double min)
  {
    return this.position += this.Geschwindigkeit*(min/60.0);
  }
  abstract public int maxGeschwindigkeit();
  abstract public int anzahlRaeder();
  abstract public void setzeGeschwindigkeit(double speed);
}
Auto
Java:
public class Auto extends Fahrzeug
{
  //Attribute
  public int anzahlRaeder;
  public int maxGeschwindigkeit;
  //Constructor
  Auto(double position,double speed,int maxGeschwindigkeit)
  {
    super(position);
    this.anzahlRaeder = 4;
    this.maxGeschwindigkeit = maxGeschwindigkeit;
    this.setzeGeschwindigkeit(speed);
  }
  Auto(double position,double speed)
  {
    super(position);
    anzahlRaeder = 4;
    maxGeschwindigkeit = 140;
    this.setzeGeschwindigkeit(speed);
  }
  //Method
  public void setzeGeschwindigkeit(double speed)
  {
    if(speed >=0 && speed <= maxGeschwindigkeit)
    {
      this.Geschwindigkeit = speed;
    }
    else
    {
      if(speed >= 0 && speed >= maxGeschwindigkeit)
      {
        this.Geschwindigkeit = maxGeschwindigkeit;
      }
      if(speed <=0)
      {
        this.Geschwindigkeit =0;
      }
    }
  }
  public int anzahlRaeder()
  {
    return anzahlRaeder;
  }
  public int maxGeschwindigkeit()
  {
    return maxGeschwindigkeit;
  }

}
Fahrrad
Java:
public class Fahrrad extends Fahrzeug
{
  //Attribute
  int anzahlRaeder;
  int maxGeschwindigkeit;

  //Konstructoren
  Fahrrad(double position,double speed)
  {
   super(position);
   maxGeschwindigkeit = 30;
   this.setzeGeschwindigkeit(speed);
   anzahlRaeder = 2;

  }
  //Methoden
  public void setzeGeschwindigkeit(double speed)
  {
    if(speed >=0 && speed <= maxGeschwindigkeit)
    {
      this.Geschwindigkeit = speed;
    }
    else
    {
      if(speed >= 0 && speed >= maxGeschwindigkeit)
      {
        this.Geschwindigkeit = maxGeschwindigkeit;
      }
      if(speed <=0)
      {
        this.Geschwindigkeit =0;
      }
    }
  }
  public int anzahlRaeder()
  {
    return anzahlRaeder;
  }
  public int maxGeschwindigkeit()
  {
    return maxGeschwindigkeit;
  }

}
Krankenwagen
Java:
public class Krankenwagen extends Auto
{
  boolean blaulicht;
  
  Krankenwagen(double position,double speed)
  {
    super(position,speed);
  }
  public void switchOnBlaulicht()
  {
   blaulicht = true;
  }
  public void switchOffBlaulich()
  {
    blaulicht = false;
  }
  
}
Rennwagen
Java:
public class Rennwagen extends Auto
{
  Rennwagen(double position,double speed)
  {
    super(position,speed,220);
  }

}

Wurde schon vom Prüfer abgenommen und für gut gefunden :)
maxGeschwindigkeit könnte man noch als nicht abstract definieren. Aber da es in der Beispiel Classe so war, hab ichs auch mal so gemacht.
 

Ähnliche Java Themen

Neue Themen


Oben