Vererbungsproblem Tierwelt

J

JavaLehrling84

Gast
Hi
ich lerne erst seit kurzem Java und sitze jetzt seit einigen Tagen an einer Aufgabe, an der ich echt Probleme habe. Mir ist folgender Quellcode gegeben:

Java:
public class Vogel extends Tierwelt{
		public void fliegen(){
			System.out.println("Ich fliege!");
		}
	}
	
	public class Hund extends Tierwelt{
		public void laufen(){
			System.out.println("Ich laufe!");
		}
	}
	
	public class Fisch extends Tierwelt{
		public void schwimmen(){
			System.out.println("Ich schwimme!");
		}
	}
	
	public class Tierwelt{
		public void bewegen(Object o){
			if (o instance of Vogel)
                              ((Vogel) o).fliegen();
                        else is (o instance of Hund)
                              ((Hund) o).laufen();
                        else if (o instance of Fisch)
                             ((Fisch) o).schwimmen();
		}
	}

Jetzt soll die bewegen so geändert werden, dass stets die korrekte Bewegungsmethode der entsprechenden Tierklasse aufgerufen wird. Dabei sollen am Ende weder switch noch if anweiseungen im Quellcode vorkommen, jedoch dürfen neue Klassen eingefügt werden.

Wie gesagt, ich hänge schon ziemlich lange an dem Problem und wäre über Tipps und Hinweise, wie ich das lösen könnte echt dankbar.
 

truesoul

Top Contributor
Java:
if ( o instanceof Hund ) 
...

Anstatt instance of .

Java:
public class Main()
{
       public static void main(String[] args)
       {
        Tierwelt tierwelt= new Tierwelt ();
        tierwelt.bewegen(new Hund());

        tierwelt.bewegen(new Vogel());

        tierwelt.bewegen(new Fisch());

     }

}

Im Prinzip hast du schon alles was du benötigst.
Erstellst dir eine Klasse mit public static void main(String[] args) um in die Methode bewegen von der Klasse Tierwelt aufzurufen.
In der Methode wird mit instanceof überprüft was für ein Tier das Objekt ist ( new Hund() ) usw.
Und dementsprechend wird die Methode vom Tier aufgerufen.
Und somit erfolgt die Ausgabe.
 
Zuletzt bearbeitet:

ARadauer

Top Contributor
ist ein Vogel eine Tierwelt? Ich denke Tierwelt ist nur die Testklasse...

Ich würds so machen...

Java:
public abstract class Tier {
   public abstract void bewegen();
}

oder
public class Tier {
   public  void bewegen(){
      System.out.println("bin ein tier ich bewege mich");
   }
}

public class Hund extends Tier{
   public void bewegen(){
      System.out.println("bin ein Hund ich laufe");
   }
}
public class Vogel extends Tier{
   public void bewegen(){
      System.out.println("bin ein Vogel ich fliege");
   }
}
public class Fisch extends Tier{
   public void bewegen(){
      System.out.println("bin ein Fisch ich schwimme");
   }
}

import java.util.ArrayList;
import java.util.List;

public class Tierwelt {
   
   public static void main(String[] args) {
      List<Tier> tiere = new ArrayList<Tier>();
      tiere.add(new Hund());
      tiere.add(new Vogel());
      tiere.add(new Fisch());
      
      tiereBewegen(tiere);
   }
   
   public static void tiereBewegen(List<Tier> tiere ){
      for(int i = 0; i < tiere.size(); i++){
         Tier t = tiere.get(i);
         t.bewegen();
      }
   }
}

bin ein Hund ich laufe
bin ein Vogel ich fliege
bin ein Fisch ich schwimme

ohne das tiereBewegen irgendwas von hund, vogel, fisch weiß... kennt nur tier, das ist die grundidee dahinter...
 
S

SlaterB

Gast
@truesoul
instanceof soll ja gerade vermieden werden,

Vererbung hat doch eine gewisse Bedeutung oder? man kann eine allgemeine Methode bewegen() einführen,
die jede Klasse überschreibt und dann die für sie richtige Methode aufruft
 

truesoul

Top Contributor
@SlaterB
Oops, mein Fehler.

Na wenigstens habe ich gezeigt wie man es nicht machen sollte :oops:

Tierwelt ist selbstverständlich die Testklasse. Hund, Vogel und Fisch erben natürlich vom Tier und nicht der Tierwelt und der rest wurde schon erklärt .

:rtfm:
 
Zuletzt bearbeitet:

Empire Phoenix

Top Contributor
Wenn man es dann ncoh schön machen will
Code:
public class Fisch extends Tier{
   @Override //sagt dem Compiler das die Methode in Tier existieren muss, ansonsten läßt er kein kompilieren zu (bsp. schreibfehler oder parameter falsch), würde ich generall empfehlen mir das anzugewöhnen.
   public void bewegen(){
      System.out.println("bin ein Fisch ich schwimme");
   }
}
 
Ähnliche Java Themen

Ähnliche Java Themen


Oben