# Vererbung Problem



## ToBe4minimal (5. Apr 2011)

Hi Leute,

folgendes, ich dreh hier nämlich gleich durch und schmeiss mein Notebook ausm Fenster.
Wir sollen für die Uni in Programmieren 2 ne Aufgabe machen bezüglich Vererbung.
Eigentlich ist die Aufgabe total simpel und ich weiss auch wie es geht, allerdings bekomm ich ständig ne Fehlermeldung und kann meine Subklassen nicht kompilieren, ich weiss jedoch einfach nicht wieso!!! ;(

Und zwar haben wir in der Aufgabe 2 Klassen (Fahrrad und Pedelec) mit sehr viel redundanten Code.
Wir sollen deswegen ne Superklasse einfügen und eben den Code entsprechend der Vererbung vereinfachen.

Meine Superklasse Fahrzeuge:

```
public class Fahrzeuge
{
    public String typ;
    public float kilometerstand;
    public float geschwindigkeit;
    public float hoechstGeschwindigkeit;   


    public Fahrzeuge(String typ, float kilometerstand, float geschwindigkeit, float hoechstGeschwindigkeit)
    {
        this.typ = typ;
        this.kilometerstand = kilometerstand;
        this.geschwindigkeit = geschwindigkeit;
        this.hoechstGeschwindigkeit = hoechstGeschwindigkeit;        
    }
    
}
```


Eine meiner Subklassen Fahrrad:

```
public class Fahrrad extends Fahrzeuge
{
    private boolean federgabelGesperrt; //erstmal nicht weiter wichtig
   
    public Fahrrad(String typ, float hoechstGeschwindigkeit)
    {
        super(typ, hoechstGeschwindigkeit); }
```


So, erstmal bis hier hin, weil hier bekomm ich die Fehlermeldung, und ich weiss einfach nicht wieso.
Die Klasse Fahrrad soll mehrere Konstruktoren bekommen, einmal ganz ohne Parameter, und mehrfach mit Parameter in unterschiedlichen Varianten.

Die Zeile super(typ, hoechstGeschwindigkeit); wird gelb eingefärbt mit der Fehlermeldung:

cannot find symbol - constructor Fahrzeuge... bla bla bla


ABER WIESO??

Ich hab doch die Variablen in der Superklasse Fahrzeuge im Konstruktor so deklariert, wie man es soll, wieso kann er damit nix anfangen?


Hoffe ihr könnt mir helfen, bin nämlich echt am verzweifeln...
Vielleicht seht ihr, wo der Fehler liegt.


LG
Tobi


----------



## SlaterB (5. Apr 2011)

angenommen, deine Superklasse Fahrzeuge hätte stattdessen den Konstruktor
[c]public Fahrzeuge(boolean hallo, List<String> test, Person xy)[/c]

würdest du dann verstehen, wenn der Compiler meckert?
was macht deinen Konstruktor besser als meinen ausgedachten (hinsichtlich dem Aufruf in der Subklasse)?

welche Kriterien gibt es um zu entscheiden ob ein Konstruktor passt oder nicht, hast du diese dann auch überprüft?
Variablendeklaration gehört übrigens nicht dazu, was der Konstruktor mit seinen Parametern macht ist ganz egal dafür ob der Aufruf an sich funktioniert oder nicht


----------



## ToBe4minimal (5. Apr 2011)

SlaterB hat gesagt.:


> angenommen, deine Superklasse Fahrzeuge hätte stattdessen den Konstruktor
> [c]public Fahrzeuge(boolean hallo, List<String> test, Person xy)[/c]
> 
> würdest du dann verstehen, wenn der Compiler meckert?
> ...




Nun, im meinem BlueJ Buch steht es aber so...
Und ich hab ne andere Aufgabe, da wurden die Parameter im Konstruktor der Superklasse genauso deklariert.

Ich persönlich finde es ja auch merkwürdig, im Konstruktor der Superklasse die ganzen Parameter zu deklarieren, zumal man dann ja eh kein Objekt der Superklasse erzeugt, sondern die Subklassen Fahrrad und Pedelec nur auf die Variablen zugreifen sollen.

Aber ich versteh trotzdem noch nicht ganz, wo der Fehler liegt.
Denn guck ich mir folgenden Abschnitt auf ner Seite an, wird es auch dort genauso gemacht:


```
class MySuperClass
{
  public MySuperClass(int i)
  {
    this.i = i;	
  }
	
  public int i;
}
class MySubClass extends MySuperClass
{
  public MySubClass(int i,String s)
  {
    super(i);
    this.s = s;
  }
	
  public String s;
}
```


Nichts anderes hab ich gemacht, oder bin ich jetzt bescheuert??!!


----------



## ARadauer (5. Apr 2011)

gibt keinen constructor Fahrzeuge... bla bla bla
ich sehe nur public Fahrzeuge(String typ, float kilometerstand, float geschwindigkeit, float hoechstGeschwindigkeit)


----------



## ToBe4minimal (5. Apr 2011)

ARadauer hat gesagt.:


> gibt keinen constructor Fahrzeuge... bla bla bla
> ich sehe nur public Fahrzeuge(String typ, float kilometerstand, float geschwindigkeit, float hoechstGeschwindigkeit)



??

Bitte etwas genauer, ich bin nicht so der Programmieren Pro...


----------



## ARadauer (5. Apr 2011)

super(i); also ein Konstruktor mit int als Parameter gibt es den in der Oberklasse?
ja: public MySuperClass(int i)

super(typ, hoechstGeschwindigkeit);
also ein Konstruktor mit String und float, gibt es den in der Oberklasse?
nein: public Fahrzeuge(String typ, float kilometerstand, float geschwindigkeit, float hoechstGeschwindigkeit)
String, float, float, float ist was anderes als String, float ;-)


----------



## ARadauer (5. Apr 2011)

ToBe4minimal hat gesagt.:


> ??
> 
> Bitte etwas genauer, ich bin nicht so der Programmieren Pro...



Programmier pro? Meine Wörter aus dem Post waren "gibt keinen" und "ich sehe nur" der rest war von dir...
 "gibt keinen" und "ich sehe nur" sind jetzt nicht so der Hacker Slang ;-)

Also du rufst einen Konstruktor der Oberklasse mit 4 Parametern auf, den gibt es aber einfach nicht...

bzw schreib halt einfach
 super(typ, hoechstGeschwindigkeit, 0f, 0f)


----------



## ToBe4minimal (5. Apr 2011)

ARadauer hat gesagt.:


> super(i); also ein Konstruktor mit int als Parameter gibt es den in der Oberklasse?
> ja: public MySuperClass(int i)
> 
> super(typ, hoechstGeschwindigkeit);
> ...




Dann liegt es doch daran... OK! Das hab ich sofort kapiert!!

In der Aufgabe steht nur jetzt folgendes:
_Die Modifikation soll die Funktion der Objekte der beiden Klassen vollständig unverändert
lassen._

Alles klar.

Aber wenn ich jetzt in der Basis Version die uns bereit gestellt wurde, in der Klasse Fahrrad mehrere (insgesamt 3) Konstruktoren habe, die unterschiedlich sind, also ich meine, einmal sind gar keine Parameter deklariert, einmal sind die Parameter typ und hoechstGeschwindigkeit und einmal typ, hoechstGeschwindigkeit und kilometerstand im Konstruktor deklariert, wie soll das dann funktionieren??

Muss ich dann eben genauso viele unterschiedliche Konstruktoren in der Superklasse definieren?

Ich versuchs mal...


----------



## SlaterB (5. Apr 2011)

du kannst auch andere super-Konstruktoren aufrufen, oder gar andere eigene Konstruktoren,
du musst auch nicht genau nur Parameter übergeben sondern kannst dir auch Werte ausdenken, etwa 0 für Zahl-Parameter..


----------



## ToBe4minimal (5. Apr 2011)

Alles klar.

Hat geklappt. 
DANKE!!!


----------

