2012-04-26 8 views
5

Sto tentando di utilizzare l'ereditarietà in modo da poter eseguire correttamente il codice contenuto nella classe di test. Non sono sicuro di come implementare una classe astratta o un'interfaccia chiamata Bagno con il metodo goPee(). Sai come codificarlo?Utilizzo dell'ereditarietà, perché goPee() non è definito nella mia classe di test?

Se aggiungo una classe astratta o un'interfaccia e le aggiungo alla classe Human tramite estensioni o implementazioni rispettivamente, mi viene sempre chiesto di scrivere l'implementazione nella classe Human per il metodo goPee(), che non desidero da fare, poiché la mia implementazione del metodo goPee() è scritta nelle classi Bambino maschio e femmina.

import java.util.ArrayList; 

class Human 
{ 
    private String name; 
    public Human (String name) 
    { 
    this.name = name; 
    } 
    public String getName() 
    { 
    return name; 
    } 
    public void eat() 
    { 
    System.out.println(name + " went to fridge."); 
    } 
} 

class Male extends Human 
{ 
    public Male(String name) 
    { 
    super(name); 
    } 
    public void goPee() 
    { 
    System.out.println(getName() + " stood up."); 
    } 
} 

class Female extends Human 
{ 
    public Female(String name) 
    { 
    super(name); 
    } 
    public void goPee() 
    { 
    System.out.println(getName() + " sat down."); 
    } 
} 

public class TestHuman 
{ 
    public static void main(String[] args) 
    { 
    ArrayList<Human> arr = new ArrayList<Human>(); 
    arr.add(new Male("john")); 
    arr.add(new Female("sally")); 
    for (int count = 0; count < arr.size(); count++) 
    { 
     arr.get(count).eat(); 
     arr.get(count).goPee(); 
    } 
    } 
} 
+0

So come codificarlo. Che cosa hai provato? Quali sono i tuoi pensieri? – Jeffrey

+15

Bene +1 per farmi dare un'occhiata alla domanda. –

+0

Tutto il tuo codice sa che hai a che fare con un elenco che contiene oggetti 'Human'. Pertanto, ti è permesso di trattare con membri di Human. Il tuo metodo desiderato non è su Human. Vedi il problema? –

risposta

7

è necessario definire un metodo goPee() nella classe Umana. Dal momento che lo stai scavalcando in entrambe le sottoclassi, può essere un metodo astratto. Ciò significa anche che l'uomo deve essere astratto.

abstract class Human 
{ 
    private String name; 
    public Human (String name) 
    { 
    this.name = name; 
    } 
    public String getName() 
    { 
    return name; 
     } 
    public void eat() 
    { 
    System.out.println(name + " went to fridge."); 
    } 
    public abstract void goPee(); 
} 

Dichiarazione di un metodo astratto in Human assicura che tutte le sottoclassi di umano implementano il metodo goPee() con gli stessi parametri e tipo di ritorno. Questo ti consente di chiamare goPee() su un Umano senza sapere se si tratta di un Maschio o di una Femmina, poiché sai che entrambi lo implementano.

5

Al fine di essere in grado di chiamare il metodo di sottoclassi polimorfico, è necessario definire un metodo con la stessa firma nella classe base.

abstract class Human { 
    public abstract void goPee(); 
} 

Non è necessario per rendere la classe astratta, ma in questo caso ha senso farlo, perché non ci sono esseri umani asessuato. Tuttavia, se si desidera condividere qualche implementazione tra i metodi di classi derivate, si potrebbe mettere codice comune nella implementazione della classe base:

class Human { 
    public void goPee() { 
     System.out.println(getName() + " lifted the cover."); 
    } 
} 

class Male extends Human { 
    public void goPee() { 
     super.goPee(); 
     System.out.println(getName() + " stood up."); 
    } 
} 

class Female extends Human { 
    public void goPee() { 
     super.goPee(); 
     System.out.println(getName() + " sat down."); 
    } 
} 
+0

Sono abbastanza sicuro che se hai un metodo astratto in una classe, javac genererà un errore a meno che la classe non sia astratta. – MALfunction84

+0

@ MALfunction84 Ovviamente javac segnalerà un errore se un metodo astratto viene trovato in una classe non astratta. Ma non devi necessariamente rendere astratto il metodo (ho aggiornato la risposta per illustrare questo punto). – dasblinkenlight

0

Il tuo problema fondamentale è che stai provando a chiamare un metodo su un riferimento Umano che non esiste.

Se si esegue correttamente il cast dell'oggetto su un oggetto Maschio o Femmina, si scoprirà che è possibile chiamare il metodo. Poiché il tuo contenitore conosce solo la tua classe base, dovresti definire il metodo lì, e quindi il polimorfismo chiamerebbe la definizione corretta nel tipo legato al riferimento Umano. (vale a dire un oggetto maschio o femmina)

Problemi correlati