2016-11-23 1 views
-1

Ich schreibe ein Programm, das auf der Demonstration der Vererbung basiert. Ich versuche, eine Ausnahme zu schreiben, so dass der einzige Parameter, der in die Meat-Klasse übergeben werden kann, die mit der Klasse Wolf verknüpft ist. Im Wesentlichen versuche ich zuzulassen, dass der einzige Parameter, der in die Essmethode übernommen werden kann, eine Nahrungsmittelvariable ist, die Fleisch genannt wird. Hier ist der Code:Wie wird ein Argument übergeben, das einen Parameter des Typs Essen benötigt?

Tier

abstract public class Animal 
{ 

String name; 
int age; 
String noise; 

abstract public void makeNoise(); 

public String getName() { 
     return name; 
    } 

    public void setName(String newName) { 
     name = newName; 
    } 

abstract public Food eat(Food x) throws Exception; 

} 

Lebensmittel

public class Food { 

    //field that stores the name of the food 
    public Food name; 

    //constructor that takes the name of the food as an argument 
    public Food(Food name){ 
     this.name = name; 
    } 

    public Food getName() { 
     return name; 
    } 
} 

Fleisch

public class Meat extends Food 
{ 

    public Meat(Food name) 
    { 
     super(name); 
    } 

    public Food getName() 
{ 
    return super.getName(); 
} 
} 

Carnivore

public class Wolf extends Carnivore 
{ 

Wolf() 
{ 
    name = "Alex"; 
    age = 4; 

} 
    public void makeNoise() 
    { 
     noise = "Woof!"; 
    } 
    public String getNoise() 
    { 
     return noise; 
    } 
    public String getName() 
    { 
     return name; 
    } 
    public int getAge() 
    { 
     return age; 
    } 

    public Food eat(Food x) throws Exception 
    { 
     if (x instanceof Meat) { 
       return x; 
      } else { 
       throw new Exception("Carnivores only eat meat!"); 
      } 
    }  
} 

Wolf

public class Wolf extends Carnivore 
{ 

Wolf() 
{ 
    name = "Alex"; 
    age = 4; 

} 
    public void makeNoise() 
    { 
     noise = "Woof!"; 
    } 
    public String getNoise() 
    { 
     return noise; 
    } 
    public String getName() 
    { 
     return name; 
    } 
    public int getAge() 
    { 
     return age; 
    } 

    public Food eat(Food x) throws Exception 
    { 
     if (x instanceof Meat) { 
       return x; 
      } else { 
       throw new Exception("Carnivores only eat meat!"); 
      } 
    } 
} 

Haupt

public class Main { 

    public static void main(String[] args) 
    { 

     Wolf wolfExample = new Wolf();   
     System.out.println("************Wolf\"************"); 
     System.out.println("Name = " + wolfExample.getName()); 
     System.out.println("Age = " + wolfExample.getAge()); 
     wolfExample.makeNoise(); 
     System.out.println("Noise = " + wolfExample.getNoise()); 

     Meat meatExample = new Meat(//Food argument goes here?); 
     System.out.println("************Wolf eating habits************"); 
     System.out.println("Wolves eat " + wolfExample.eat(meatExample.getName())); 
    } 
} 

Das Problem, das ich habe ist, dass ich nicht in irgendetwas als Nahrungs Argument innerhalb des neuen passieren kann Fleischobjekt, das ich innerhalb meiner Hauptmethode erstelle. Und ich mm bekomme den Fehler einer nicht unterstützten Ausnahme, wenn ich versuche, aufzurufen, was ich denke, weil eine Food-Variable nicht übergeben worden ist. Das gewünschte Ergebnis ist, dass eine Food-Variable wie Pflanzen übergeben wird, die eine Ausnahmebedingung auslöst . Irgendeine Hilfe, wie man das löst, wird geschätzt, danke.

+0

Sie sollten Ihren verwirrten Einzug beheben. – khelwood

+0

übergeben Sie einfach meatExample statt meatExample.getName(). –

+0

'Meat meatExample = new Meat (// Food argument goes here?)' Braucht noch ein Food-Argument, in dem ich noch unsicher bin. – James

Antwort

0

Sie werden zu m haben odify Ihre Tier-und Food-Klassen zuerst und dann mit einigen anderen Änderungen in Ihrer Main-Klasse, können Sie erreichen, was Sie versuchen, zu erreichen. Hier sind einige Änderungen vorgeschlagen:

public class Food { 

    //field that stores the name of the food 
    public String name; 

    //constructor that takes the name of the food as an argument 
    public Food(String name){ 
     this.name = name; 
    } 

    public String getName() { 
     return name; 
    } 
} 

public class Meat extends Food 
{ 
    public Meat(String name) { 
     super(name); 
    } 

    public String getName() { 
     return super.getName(); 
    } 
} 


public class Main { 
    public Main() { 
     super(); 
    } 

    public static void main(String[] args) { 
     Wolf wolfExample = new Wolf();   
      System.out.println("************Wolf\"************"); 
      System.out.println("Name = " + wolfExample.getName()); 
      System.out.println("Age = " + wolfExample.getAge()); 
      wolfExample.makeNoise(); 
      System.out.println("Noise = " + wolfExample.getNoise()); 

     try {    
      Meat meatExample = new Meat("Steak"); 
      //Food vegFood = new Food("Spinach"); 
        System.out.println("************Wolf eating habits************"); 
      wolfExample.eat(meatExample); 
      //wolfExample.eat(vegFood); 

     } catch (Exception e) { 
      // TODO: Add catch code 
      e.printStackTrace(); 
     } 
    } 
} 

Also, wenn Sie wolfExample.eat(vegFood); Ihren Code aufrufen Ausnahme werfen.

0

Zuallererst ist Ihre Carnivore-Klasse und Wolf-Klasse gleich.

Sie nicht Namen bestanden haben, für Ihre ‚meatExample‘

Und versuchen Fleisch Objekt zu erhalten und es in der Lebensmittelklasse zuordnen

Food meatExample = new Meat("Beef"); 

diese Weise können Sie getName() Methode der Lebensmittelklasse fordern statt aus der Fleischklasse.

0

Grundsätzlich Ihre Food und Meat Klasse Design ist falsch, was repariert werden muss, wie unten gezeigt das heißt, Meat Klasse das Argument der Nahrung name Eigenschaft nehmen sollte.

Lebensmittelklasse:

public abstract class Food { 

    //field that stores the name of the food 
    protected String name; 

    public String getName() { 
     return this.name; 
    } 
} 

Fleischklasse:

public class Meat extends Food { 

    public Meat(String name) { 
     super.name = name; 
    } 

    //other methods or add other specific meat fields 
} 

main() Methode:

public static void main(String[] args) { 

     //Create the Meat Object by sending the name in constructor 
     Meat meatExample = new Meat("Chicken"); 
     //other code 
} 
+0

Ich denke, sollte auseinander arbeiten, die Tatsache, dass es nach einer Food-Variable sucht und eine String-Variable wurde übergeben, so bekomme ich die Fehlermeldung "String kann nicht in Lebensmittel umgewandelt werden"? – James

Verwandte Themen