Probleme bei OO-Programmierung mit Vererbung

Oevie

Mitglied
Hallo!

Ich hab in der Uni ein Semester Informatik, in dem wir Java-Programmierung durchnehmen.
Bin bisher eigentlich echt gut mitgekommen, nur seitdem wir mit OO-Programmierung angefangen haben hakts bei mir n bißchen, besonders was Vererbung angeht.
Wir programmieren btw mit eclipse...

mein Problem:

wenn ich zu dieser Klasse eine Unterklasse schreiben soll (heißt das so? Ich hoffe ich drücke mich nicht zu ungenau aus.) bekomm ich nur Fehlermeldungen. Wie bilde ich den Konstruktor?? Ich raff das irgendwie nicht...

//Klasse
public abstract class Transporter {

protected String ort;
protected Kiste ladung;

public Transporter(String ort) {
this.ort = ort;
}

public abstract void transportiere();

...

//Unterklasse "LKW"

public class LKW extends Transporter {

public void LKW ; Transporter (String ort , Kiste ladung){ //Konstruktor
this.ladung = ladung;
this.ort = ort;

super(Transporter ());
}



Ich weiß meine Beschreibung des Problems ist wohl noch "n bißchen" ungenau. ich bin leider etwas in eile ^^
aber vllt reichts ja schon für euch, um mir zu erklären was ich da falsch mach.
wenn nicht,kann ich später auch noch mehr quelltext posten mit aufgabenstellung und so, damit ich meine verständnisprobleme ausmerzen kann...

gruß Oevie
 
Und der LKW braucht noch eine Methode:
Java:
public void transportiere() {}
Da abstrakte Methoden in einer konkreten Unterklasse implementiert werden müssen.
 
wow...ihr habt mir schon echt gut geholfen. =)
danke dafür erstmal.

das mit der methode "transportiere" wusste ich zum glück schon.
das problem ist nur das "wie".

ich habs bisher soweit gebracht:

Java:
public void transportiere(){
		
                Kiste k = ladung;

		System.out.println ("Die Ladung hat den Inhalt " + k.getInhalt ());
		System.out.println ("Der Transporter startet bei " + k.getOrt ());
		System.out.println ("Das Ziel ist " + k.getZiel ());

		}

(danke übrigens für den
Java:
tipp. ich hatte die rote Zeile tatsächlich übersehen)

dann muss ich noch die attribute von LKW und Ladung (was dann wohl die Kiste k wäre?) auf den Zielort setzen. aber wie mache ich das? ich hab zwar in der klasse Kiste eine methode setZiel aber wenn ich die in der methode "transportiere" aufrufe, will er, dass ich da nen String eingeb. aber ich will ja eigentlich, das er das Ziel anniimt,was ich vorher schon festgelegt habe.

grrr...

naja...und am ende will ich denn noch im hauptprogramm eine methode aufrufen, die dann quasi nen transportauftrag übernimmt. die methode hat zwei variablen (einmal vom typ kiste und einmal vom typ lkw) aber da hab ich wieder das problem,dass wenn ich schreibe...

[code=Java]
Transporter.fahrAuftrag(kiste1, lkw1);

...java mir sagt, das ich die beiden klammern wegmachen soll. aber die bracuh ich doch,oder??

gruß
Oevie


(wenn ihr mehr infos bezüglich quelltext brauch sagts,dann poste ich noch was. ich wollt nur erstmal versuchen möglichst wenig hier zu posten, damit es übersichtlich bleibt)
 
Java:
public abstract class Transporter {

//Attribute
protected String ort;
protected Kiste ladung;


//Konstruktor
public Transporter(String ort) {
this.ort = ort;
}

//Methoden
public void setOrt (String ort){
this.ort=ort;
}

public String getOrt(){
return this.ort;
}

public void setLadung (Kiste ladung){
this.ladung=ladung;
}

public Kiste getLadung(){
return this.ladung;
}

public void transportiere(String ziel){
System.out.println ("Die Ladung hat den Inhalt " + k.getInhalt ());
System.out.println ("Der Transporter startet bei " + this.ort);
System.out.println ("Das Ziel ist " + ziel);
this.ort=ziel;
}


//Unterklasse "LKW"
Java:
public class LKW extends Transporter {
//Attribute: siehe Transporter

//Konstruktor
public LKW (String ort , Kiste ladung){ 
super(ort);
this.ladung=ladung;
}

//Methoden: keine
}


und in der Main:
Java:
Transporter transporter1=new LKW("Hamburg", new Kiste()); //wobei Kiste wohl ein Object sein wird?
Transporter.transportiere("Erfurt");
 
hm...danke für deine mühe. so ganz komm ich allerdings trotzdem nicht auf meine antworten.
ich denke, ich poste mal den ganzen quelltext, damit es für jeden eindeutig wird.

also als erstes die Klasse Transporter:
(Diesen Quelltext habe ich vorgegeben bekommen und sollte ihn auch deshalb nicht verändern.)

Java:
public abstract class Transporter {

	protected String ort;
	protected Kiste ladung;

	public Transporter(String ort) {
		this.ort = ort;
	}

	public abstract void transportiere();

	public void beladen(Kiste k){
		System.out.println("Die Kiste mit dem Inhalt "+k.getInhalt()+"wurde in "+ort+" aufgeladen");
		ladung = k;
	}

	public String getOrt(){
		return ort;
	}

	public void fahreZu(String ort){
		System.out.println("Transportfahrzeug begibt sich ohne Ladung von "+this.ort+" nach "+ort);
		this.ort = ort;
	}

	public Kiste abladen(){
		System.out.println("Die Kiste mit dem Inhalt"+ladung.getInhalt()+" wurde in "+ort+" abgeladen");
		Kiste temp = ladung;
		ladung = null;
		return temp;
	}
}

Dann die Klasse Kiste, die mir vorgegeben wurde:

Java:
public class Kiste {
	
	private String ort;
	private String inhalt;
	private String ziel;
	
	public Kiste(String ort, String inhalt, String ziel){

		this.ort = ort;
		this.inhalt = inhalt;
		this.ziel = ziel;
	}

	public void setZiel(String ziel){
		this.ziel = ziel;
	}

	public String getZiel(){
		return ziel;
	}

	public void setOrt(String ort){
		this.ort = ort;
	}

	public String getOrt(){
		return ort;
	}

	public String getInhalt(){
		return inhalt;
	}
}

Nun MEINE Klasse "LKW"

Java:
public class LKW extends Transporter {
	
	public LKW (String ort , Kiste ladung){
		super (ort);
		this.ladung = ladung;
	}
	
	
	public void transportiere(){
		
		String ziel;
				
		System.out.println ("Die Ladung hat den Inhalt " + k.getInhalt ());
		System.out.println ("Der Transporter startet bei " + // Transporter.getort?? );
		System.out.println ("Das Ziel ist " + k.getZiel ());
		
		this.ort = ziel;
	
		//Die Attribute Ort von Lkw und Ladung müssen auf den Zielort gesetzt werden
	}

}

und zum Schluss das Hauptprogramm, in der ich die Main-Methode schreiben soll:

Java:
public class Hauptprogramm {
	public static void fahrAuftrag(Kiste k, LKW l1){
		
		System.out.println();
		System.out.println("Neuer Fahrauftrag erhalten");

		
		if (l1.getOrt() != k.getOrt()){
			
			l1.fahreZu(k.getOrt());
		}
		
		l1.beladen(k);
		l1.transportiere();
		l1.abladen();
}
	//meine Main-Methode
	
	Kiste kiste1 = new Kiste ("Halle", "Holz", "Hof");
	Kiste kiste2 = new Kiste ("Lager", "Steine", "Halle");
	
	Transporter lkw1 = new LKW ("Garage", null);
	Transporter lkw2 = new LKW ("Hof", null);

	Transporter ... =new LKW("Halle", kiste1);
	lkw1 = Transporter.fahrAuftrag(kiste1, lkw1);

}

Was ich halt immer noch nicht genau weiß, ist, wie ich die Attribute Ort von Lkw und Ladung auf den Zielort setze damit der Transport abgeschlossen ist.

Und in der Main hab ich ja 2 neue Transporter (lkw1 und 2) und Kisten erstellt. Nur weiß ich nicht, wie ich diese Methode "fahrAuftrag" mit z.b. kiste1 und lkw1 aufrufen kann...
 
Zuletzt bearbeitet:
Java:
lkw1 = Transporter.fahrAuftrag(kiste1, lkw1);
Das geht nicht, da die Methode fahrAuftrag den Rückgabetyp void hat, also:
Java:
Transporter.fahrAuftrag(kiste1, lkw1);
Ansonsten ist die Methode transportiere() in der Klasse LKW noch nicht richtig implementiert. Prinzipiell muss die ja das selbe machen, wie die Methode fahrezu() aus der Superklasse.
 
aber wenn ich das so schreibe

Java:
Transporter.fahrAuftrag (kiste1, lkw1);

sagt mir eclipse immer, dass ich die beiden klammern entfernen soll.
oder liegt das daran, dass ich die Methode transportiere() in der Klasse LKW noch nicht richtig implementiert habe.

was fehlt denn da alles noch?? =/
ich raff das nicht so ganz...
 
Schaut denn die Klasse Hauptprogramm genauso aus wie gepostet??
Dann geht das natürlich nicht. Eine Methode kann nur innerhalb eines Konstruktors oder einer anderen Methode aufgerufen werden.
In Deinem Fall brauchst Du erst mal eine main Methode und darin kannst Du dann die Methode aufrufen.
 
Java:
public static void main (String args []){

fehlt quasi? das würde durchaus sinn ergeben 😉

Java:
public static void main (String args []){

           Kiste kiste1 = new Kiste ("Halle", "Holz", "Hof");
           Kiste kiste2 = new Kiste ("Lager", "Steine", "Halle");
		
		Transporter lkw1 = new LKW ("Garage", null);
		Transporter lkw2 = new LKW ("Hof", null);
}

ist dann jetzt meine main. müsste doch so richtig sein,oder? wie rufe ich jetzt die methode auf?
 
Java:
public class Hauptprogramm {
	public static void fahrAuftrag(Kiste k, LKW l1) {
		System.out.println();
		System.out.println("Neuer Fahrauftrag erhalten");

		if (l1.getOrt() != k.getOrt())
			l1.fahreZu(k.getOrt());

		l1.beladen(k);
		l1.transportiere();
		l1.abladen();
	}

	public static void main(String[] args) {   
		Kiste kiste1 = new Kiste ("Halle", "Holz", "Hof");
		Kiste kiste2 = new Kiste ("Lager", "Steine", "Halle");
    
		Transporter lkw1 = new LKW ("Garage", null);
		Transporter lkw2 = new LKW ("Hof", null);
 
		Hauptprogramm.fahrAuftrag(kiste1, lkw1);
    }
}
 
ach sooo...oh man.

meine neue Main:

Java:
public static void main (String args []){
		
		Kiste kiste1 = new Kiste ("Halle", "Holz ", "Hof");
		Kiste kiste2 = new Kiste ("Lager", "Steine ", "Halle");
		
		LKW lkw1 = new LKW ("Garage", null);
		LKW lkw2 = new LKW ("Hof", null);

		Hauptprogramm.fahrAuftrag (kiste1 , lkw1);
	}
}

Ich musste noch in Zeile 6 und 7 aus "Transporter" "LKW" machen, weil "fahrAuftrag" ja für die Typen Kiste und LKW definiert ist (und nicht für Transporter).

Jetzt nur noch mein problem mit der Methode transportiere ():

Java:
	public void transportiere(){
		
		
		System.out.println ("Die Ladung hat den Inhalt " + k.getInhalt ());
		System.out.println ("Der Transporter startet bei " + ort );
		System.out.println ("Das Ziel ist " + k.getZiel ());
		
l1 = ort.getZiel ();
		ladung = ort.getZiel ();
	}


Meine Ausgabe soll die Ladung, den Ort des Transportstartes und das Ziel ausgeben.
Da in der fahrAuftrag-Methode 2 variablen (Kiste k, LKW l1) daklariert werden,müsste ich doch einfach dadrauf zugreifen können,oder??
Das geht doch über get und set-methoden...?

und um den lkw1 auf den zielort zu setzen bräuchte ich doch eine methode setOrt in Transporter,oder? aber die hab ich nich vorgegeben.
bei der ladung hab ich das gleiche problem...
 
Hier wurden inzwischen viele Codeschnipsel gepostet, und anscheinend hat nur Michael... das noch über die ersten Beiträge hinaus nachvollzogen. Wenn du noch mal den kompletten aktuellen Stand und eine konkrete Frage postest, kann bestimmt noch jemand was dazu sagen...
 
ok =)

zur besseren übersicht der aktuelle Stand des Programms:

Die mir vorgegebene Klasse Transporter,mit der abstrakten Methode transportiere:
Java:
public abstract class Transporter {

	protected String ort;
	protected Kiste ladung;

	public Transporter(String ort) {
		this.ort = ort;
	}

	public abstract void transportiere();

	public void beladen(Kiste k){
		System.out.println("Die Kiste mit dem Inhalt "+k.getInhalt()+"wurde in "+ort+" aufgeladen");
		ladung = k;
	}

	public String getOrt(){
		return ort;
	}

	public void fahreZu(String ort){
		System.out.println("Transportfahrzeug begibt sich ohne Ladung von "+this.ort+" nach "+ort);
		this.ort = ort;
	}

	public Kiste abladen(){
		System.out.println("Die Kiste mit dem Inhalt"+ladung.getInhalt()+" wurde in "+ort+" abgeladen");
		Kiste temp = ladung;
		ladung = null;
		return temp;
	}
}

Dann die mir ebenfalls vorgegebene Klasse Kiste:
Java:
public class Kiste {
	
	private String ort;
	private String inhalt;
	private String ziel;
	
	public Kiste(String ort, String inhalt, String ziel){

		this.ort = ort;
		this.inhalt = inhalt;
		this.ziel = ziel;
	}

	public void setZiel(String ziel){
		this.ziel = ziel;
	}

	public String getZiel(){
		return ziel;
	}

	public void setOrt(String ort){
		this.ort = ort;
	}

	public String getOrt(){
		return ort;
	}

	public String getInhalt(){
		return inhalt;
	}
}

Hier das Hauptprogramm mit der von mir erstellten Main-Methode:
Java:
public class Hauptprogramm {
	public static void fahrAuftrag(Kiste k, LKW l1){
		
		System.out.println();
		System.out.println("Neuer Fahrauftrag erhalten");

		
		if (l1.getOrt() != k.getOrt()){
			
			l1.fahreZu(k.getOrt());
		}
		
		l1.beladen(k);
		l1.transportiere();
		l1.abladen();
}
	
public static void main (String args []){
		//meine Main-Methode
		
		Kiste kiste1 = new Kiste ("Halle", "Holz ", "Lager");
		Kiste kiste2 = new Kiste ("Lager", "Steine ", "Halle");
		Kiste kiste3 = new Kiste ("Lager", "Waffen ", "Hafen");
		
		LKW lkw1 = new LKW ("Garage", null);
		LKW lkw2 = new LKW ("Hof", null);

		Hauptprogramm.fahrAuftrag (kiste1 , lkw1);
		Hauptprogramm.fahrAuftrag (kiste3 , lkw2);
		Hauptprogramm.fahrAuftrag (kiste2 , lkw2);
	}
}

Und zu guter letzt die Unterklasse LKW bei der ich noch schwierigkeiten habe:
Java:
public class LKW extends Transporter {
	
	public LKW (String ort , Kiste ladung){
		super (ort);
		this.ladung = ladung;
	}
	
	
	public void transportiere(){
				
		Kiste k;
		LKW l1;
		
		System.out.println ("Die Ladung hat den Inhalt " +k.getInhalt());
		System.out.println ("Der Transporter startet bei " + ort );
		System.out.println ("Das Ziel ist " + k.getZiel ());
		
	}
}

mein Problem ist es jetzt, die methode transportiere () zu vervollständigen.
und zwar will ich den Inhalt der Kiste anzeigen lassen, den Ort des Transporters (beim Start) und das Ziel der Kiste.
Desweiteren muss ich noch die Attribute Ort von Lkw und Ladung auf den Zielort setzen...da weiß ich aber nicht,wie das geht.

in der ausgabe von transportiere will ich ja auf die get und set methoden von kiste und wenn nötig transporter zugreifen. weiß aber wie ich das in der syntax ausdrücke =/
weiß jemand rat?
 
OK, in der Klasse LKW kannst du (wenn ich das jetzt richtig sehe - hab's nicht getestet) einfach auf Ort und Ladung zugreifen...
Java:
public void transportiere()
{
        System.out.println ("Die Ladung hat den Inhalt " +ladung.getInhalt());
        System.out.println ("Der Transporter startet bei " + ort );
        System.out.println ("Das Ziel ist " + ladung.getZiel ());
                
}

"OO-Nazis" würden sagen, dass sowohl ladung als auch ort in der Klasse Transporter eigentlich private sein sollten, und man nur die get-Methoden verwenden sollte (d.h. dass man für "Ladung" in der Klasse Transporter noch eine protected get-Methoden einführen sollte...)

Das Setzen des Ortes der Ladung ("nach dem transport") kreigst du jetzt hin ...?
 
Ist ja wirklich kein Problem die Methode zu implementieren:
Java:
public void transportiere()
{
        System.out.println ("Die Ladung hat den Inhalt " +ladung.getInhalt());
        System.out.println ("Der Transporter startet bei " + ort );
        System.out.println ("Das Ziel ist " + ladung.getZiel ());

        ort=ladung.getZiel(); //Setzt den Ort des Lasters entsprechend dem Ziel der Ladung
        ladung.setOrt(ort); //Setzt den Ort der Ladung entsprechend dem Ort des Lasters
}

allerdings scheint mir das Programm wenig sinnvoll.
Zum Beispiel die Methode abladen. Meinermeinung nach sollte das Abladen nur möglich sein, wenn die Kiste sich am Zielort befindet.
Außerdem sollte die Methode transportiere mit der Methode fahreZu zu einer Methode gemacht werden und nur die Bewegung des Lasters beinhalten.
Das bedeutet, dass man der fahreZu(oder setOrt oder transportiere) Methode den Parameter String ort gibt und this.laster=ort ausführt.)
Dann kann man natürlich eine Fahrverwaltung zB in der Main einrichten, die ungefähr so aussieht:

Java:
Ladung kiste1=new Kiste("Bremen","Waffen","Düren");
Transporter lkw1=new LKW("München",null);
fahreAuftrag(lkw1,kiste1);

public void fahreAuftrag(Transporter transporter, Ladung ladung){
   if(transporter.getLadung()!=ladung){ //Wenn der Transporter die Ladung nicht hat, muss er sie holen
      if(transporter.getOrt()!=ladung.getOrt()){ //Wenn der LKW nicht bei Kiste ist, muss er hinfahren
         transporter.fahreZu(ladung.getOrt());
      }
      transporter.belade(ladung);
   }
   if(transporter.getOrt()!=ladung.getZiel()){ //Wenn LKW nicht am zielort ist, muss er hinfahren
      transporter.fahreZu(ladung.getZiel();
   }
   transporter.abladen(); //diese methode braucht kein return-Statement meiner Ansicht nach.
}

Ich vermute mal die nächste Aufgabe wird darin liegen, den Transporter nicht nur Kisten mit Strings verladen zu lassen, sondern Objekte, aber das kommt noch 🙂

Viel Spaß noch

lg FightClb
 
Zuletzt bearbeitet:
JAU! jetzt läufts auch =)

jetzt hab ich auch endlich was,woran ich mich orientieren kann,was syntax bzw. quelltext allgemein angeht.
aber im grunde ist es ja auch logisch...wenn mans erst einmal gesehen/gemacht hat.

leider ist das semester vorbei und ich hab nur insgesamt ein semester info. würd gern noch n bißchen mehr über java-programmierung lernen, aber ich hab ja jetzt n kompetentes forum gefunden :rtfm:
jetzt muss ich nur noch die zeit finden =P

naja. vielen dank nochmal 😉
 

Neue Themen


Zurück
Oben