Quale sarebbe il modo corretto di progettare la gerarchia delle classi qui?

2

Sto scrivendo un'applicazione "terreno di caccia" in Java. Ho pianificato la gerarchia delle classi come segue:

Animal.java

public interface Animal {

    void age();

    void reproduce();

    boolean isAlive();

    void die();
}

Carnivorus.java

public abstract class Carnivorus implements Animal {

    double age;
    double expectancy;
    boolean alive;

    abstract void hunt();
}

Herbivore.java

public abstract class Herbivore implements Animal{

    double age;
    double expectancy;
    boolean alive;

    abstract void graze();

}

Lion.java

public class Lion extends Carnivorus {


    Lion(double currentAge,double livesFor){

        age = currentAge;
        expectancy = livesFor;
        alive = true;
    }

    @Override
    public void reproduce() {
        // TODO Auto-generated method stub

    }

    @Override
    public void hunt() {
        // TODO Auto-generated method stub

    }

    @Override
    public void age() {
        // TODO Auto-generated method stub
        age--;

    }

    @Override
    public void die() {
        // TODO Auto-generated method stub
        alive = false;

    }

    public boolean isAlive(){

        return alive;
    }


}

Ho notato che le definizioni delle variabili in Carnivore e Herbivore sono ripetute. Ma dal momento che Animal è un'interfaccia, non posso definire variabili lì. Nel caso in cui abbia cambiato l'animale in una classe astratta e definito le variabili lì, le interfacce Carnivore e Herbivore non possono estenderlo. Quale sarebbe il modo corretto di progettarlo?

    
posta freerunner 16.08.2016 - 12:08
fonte

2 risposte

4

Sì, il tuo problema è che il livello che questi animali condividono gli attributi è ciò che dovrebbe essere una classe astratta. Dovresti essere in grado di estendere una classe astratta con un'altra classe astratta, in questo modo:

L'animale diventa una classe astratta:

public abstract class Animal {

    double age;
    double expectancy;
    boolean alive;

    Animal(double currentAge,double livesFor) {
        age = currentAge;
        expectancy = livesFor;
        alive = true;
    }

    void age() {
        // TODO:
    }

    void reproduce() {
        // TODO:
    }

    boolean isAlive() {
        // TODO:
    }

    void die() {
        // TODO:
    }
}

Carnivoro diventa quindi:

public abstract class Carnivorus extends Animal {
    abstract void hunt();
}

e Herbivore ora è:

public abstract class Herbivore extends Animal{
    abstract void graze();
}
    
risposta data 16.08.2016 - 16:37
fonte
1

But since Animal is a interface, I can't define variables there. In case I changed the Animal to a abstract class and defined the variables there, the Carnivore and Herbivore interfaces can't extends it.

Nel tuo codice Carnivore e Herbivore non sono interfacce ma classi astratte in modo che possano estendere Animal se lo hai trasformato in una classe astratta.

D'altra parte l'interfaccia di Animal (se doveva rimanere tale) ha bisogno di alcuni metodi che suggeriscono implementatori di stato aggiuntivo:

public interface Animal {
    void age();
    void reproduce();
    boolean isAlive();
    void die() throws AlreadyDeadException;
    public double getCurrentAge();
    public double getLifeExpentancy();
}
risposta data 16.08.2016 - 16:44
fonte

Leggi altre domande sui tag