2016-07-11 8 views
-1

Mein Problem sieht vor, die folgende, den Umgang mit Vögeln:Wie kann ich diese Klassen dazu bringen, diese Eigenschaften zu erben?

  1. Vögel fliegen können.
  2. Enten fliegen aber auch schwimmen.
  3. Pinguine fliegen nicht.
  4. Pinguine tauchen tief, im Gegensatz zu Enten.
  5. Nur Papageien können sprechen.

Hier ist mein Code:

import java.util.*; 
public class Code 
{ 
    public static void main(String[] args) 
    { 
    Bird[] birds = new Bird[3]; 
    birds[0] = new Duck(true, false, false, false); 
    birds[1] = new Penguin(false, true, false, true); 
    birds[2] = new Parrot(true, false, true, false); 
    } 
} 

abstract class Bird 
{ 
    abstract boolean flight(); 
    abstract boolean deepdive(); 
    abstract boolean talk(); 
    abstract boolean swim(); 

    Bird (boolean flight, boolean deepdive, boolean talk, boolean swim) 
    { 
    this.flight = flight; 
    this.deepdive = deepdive; 
    this.talk = talk; 
    this.swim = swim; 
    } 

} 

abstract class Duck extends Bird 
{ 
    public Duck(boolean flight, boolean deepdive, boolean talk, boolean swim) 
    { 
    super(flight, deepdive, talk, swim); 
    } 
    abstract public boolean flight(); 
    abstract public boolean deepdive(); 
    abstract public boolean talk(); 
    abstract public boolean swim(); 
} 

abstract class Penguin extends Bird 
{ 
    public Penguin(boolean flight, boolean deepdive, boolean talk, boolean swim) 
    { 
    super(flight, deepdive, talk, swim); 
    } 
    abstract public boolean flight(); 
    abstract public boolean deepdive(); 
    abstract public boolean talk(); 
    abstract public boolean swim(); 
} 

abstract class Parrot extends Bird 
{ 
    public Parrot(boolean flight, boolean deepdive, boolean talk, boolean swim) 
    { 
    super(flight, deepdive, talk, swim); 
    } 
    abstract public boolean flight(); 
    abstract public boolean deepdive(); 
    abstract public boolean talk(); 
    abstract public boolean swim(); 
} 

Meine Idee war jede Aktivität als wahr oder falsch Feld zu haben, und dann von jedem Tier Ausgang zu sagen, was er kann und nicht kann, über eine Schleife. Jedoch, wenn ich versuche, es zu starten, gibt es mir: "Leere Methoden können keinen Wert zurückgeben" und "Diese Methode erfordert einen Körper statt eines Semikolons." Wie kann ich das zur Arbeit bringen?

EDIT: Ich habe einige umgesetzt, was die Leute unten zu tun, aber ich bekomme immer noch „den Typ nicht instanziiert kann ...“ und „... kann nicht aufgelöst werden oder ist kein Feld“

+1

Wenn 'Penguin' nicht fliegt, darf sein Konstruktor nicht mit' flight == true' aufgerufen werden: Übergeben Sie 'true' einfach an den' super' Konstruktor (etc für andere Eigenschaften und andere Unterklassen). –

+2

Das Problem hat nichts mit Vererbung zu tun; Sie versuchen einfach, einen 'Bird' von Ihrer' void main' Methode zurückzugeben. Entweder ersetzen Sie die Rückgabe durch 'return;' (kein Wert) oder ... tun * etwas anderes *, was nicht klar ist, was das wäre, da es nicht klar ist, warum Sie einen 'Bird' zurückgeben möchten. –

+0

Ich hatte 'neuen Pinguin (falsch, wahr, falsch, wahr); "Mit der Ordnung, Flug, Deepdive, reden, schwimmen, so dachte ich, es war falsch. Außerdem, an welchen Superkonstruktor soll ich etwas weitergeben? Was ist der Superkonstruktor im Vergleich zu Nicht-Superkonstruktoren? – user311302

Antwort

0

Problem 1: Der Compiler sagt, dass "void Methoden können keinen Wert zurückgeben" ist, weil Sie die erste Bird Instanz in Ihrem Array in Ihrer main Methode, die void deklariert zurückgegeben wird.

Um dies zu beheben, entfernen Sie einfach die for Schleife in Ihrer main Methode.

Problem 2: Der Compiler sagt, dass, weil Methoden ohne Körper in einer abstract Klasse need „Diese Methode einen Körper anstelle eines Semikolons erfordert“ abstract deklariert werden, etwa so:
abstract boolean flight();

zu Behebe dies, deklariere alle Methoden ohne Körper in deiner Bird Klasse abstract.

Problem 3: Der Compiler sagt, dass "Sie den Typ nicht instanziieren können", da der Typ, den Sie versuchen zu instanziieren, eine abstract Klasse ist. Die Ursache dieses Problems liegt darin, dass die Klassen Duck, Penguin und Parrotabstract sind, wenn sie nicht erforderlich sind. Die untergeordneten Klassen von Bird sollten überschreiben die Methoden in der Bird Klasse, deshalb haben Sie die Methoden in der Bird Klasse abstract deklariert.

Um dies zu beheben, entfernen Sie den abstract Modifikator auf alle Methoden in den Duck, Penguin und Parrot Klassen und einen Körper auf diese Methoden hinzufügen. Es ist auch üblich, die Annotation @Override in die Zeile vor jeder überschriebenen Methode einzufügen.

Problem 4: Der Compiler sagt, dass „XXX nicht aufgelöst werden kann oder kein Feld“ bedeutet, dass Sie nicht die Felder flight, deepdive, talk und swim erklärt.

Um dies zu beheben, deklarieren Sie diese Felder in der Klasse Bird (Beispiel: private boolean XXX;).

Dies wird Ihnen jedoch eine unbenutzte Warnung geben, da diese Felder im Code nur Werte enthalten und diese Werte niemals verwendet werden. Um dies zu beheben, können Sie die Felder und die Verweise auf diese vollständig entfernen, Getter und Setter für sie erstellen oder eine andere Methode verwenden, die sie verwenden würde, oder @SuppressWarnings("unused") die Zeile vor der Bird Klassendeklaration hinzufügen (Nicht empfohlen).

Weiterführende Literatur:

Hinweis: Dies sollte jedoch nur eine vorübergehende Lösung sein, da die Antwort @JonasFagundes vorgeschlagen ist einfach eine bessere Weg, dieses Problem als Ganzes anzugehen.

+0

Ich habe diese Änderungen vorgenommen; Ich bekomme immer noch "Flug kann nicht gelöst werden oder ist kein Feld" & "Diese Methode erfordert einen Körper anstelle eines Semikolons" – user311302

+0

auch bekommen "kann den Typ nicht instanziieren ...." – user311302

+0

7, 8, 9, 22, 23, 24, 25 – user311302

2

Lässt sich zuerst im Modell fokussieren.

Die beste Möglichkeit, dieses Modell in Java darzustellen, sind konkrete getrennte Klassen und Schnittstellen.

class Bird implements Flyer 
class Duck implements Flyer, Swimmer 
class Penguin implements Swimmer, DeepDiver 
class Parrot implements Flyer, Talker 

Beachten Sie, dass das Loskow-Substitutionsprinzip das Entfernen von Verhalten aus einer Oberklasse in einer Unterklasse nicht zulässt. Deshalb sollten Sie nicht, dass Birdis aFlyer, sagen Penguinis aBird aber Penguinis not aFlyer. Mit anderen Worten, andere Bird Benutzer würden das Flyer Verhalten erwarten, und diese Erwartung würde für Penguin fehlschlagen, in diesem Fall ist Vererbung nicht der richtige Ansatz.

Jetzt über die Implementierung sprechen.

Java hat keine Mehrfachvererbung oder mix-in, aber in Java 8 können Sie eine Standardmethodenimplementierung in Schnittstellen haben.

Hinweis: Vermeiden Sie die Verwendung von instanceof, verwenden Sie stattdessen Polymorphismus.