Una classe con campo extra

-1

Diciamo che ho una classe di animali ... con campi di nome, altezza e peso. Voglio creare una classe di uccelli che sia un animale, ma ha anche, per dire, le dimensioni delle ali. Come posso farlo?

La mia idea generale è quella di creare la classe animale e la classe uccello che eredita l'animale, e ha un campo aggiuntivo ... ma poi diversi tipi di uccelli erediterebbero quella classe.

Le mie domande:

  • La mia soluzione è un approccio OO appropriato a questo tipo di problema?
  • Esiste un modello di progettazione noto per la gestione dei problemi di modellazione dei dati di questo tipo?
posta aclokay 18.03.2013 - 19:43
fonte

2 risposte

2

Aggiungi solo membri alla tua classe Bird che sono comuni a tutti gli uccelli. Se vuoi aggiungere un membro chiamato Fly() , devi creare una classe FlyingBird che erediti da Bird o ereditare da un'interfaccia IFlying e implementare il metodo Fly() su di essa.

public class Bird : Animal
{
    public float WingSize;
    ...
}

public Interface IFlyable
{
    void Fly()
    void Land();
}

public class FlyingBird : Animal, IFlyable
{
    public void Fly()
    {
         // Flap wings
    }
}
    
risposta data 18.03.2013 - 19:48
fonte
0

Sì, aggiungi un campo di questo tipo a una classe derivata, proprio come hai descritto tu. Tutti gli uccelli hanno le ali

È utile considerare come userete questa proprietà. Le persone nuove a OO, e specialmente i vecchi che hanno programmato molto prima dei primi giorni di OO, potrebbero voler scrivere codice come (non in una lingua particolare):

for all Animals a in someListOfAnimals:
   print a.name, " has weight of ", a.weight
   if a is a Bird,
       print " and a wingspan of ", a.wingsize

ma questo è gravemente sbagliato nella progettazione OO. Devi sempre cercare di pensare al giusto livello di astrazione. Il modo giusto sarà qualcosa di più simile a

for all Animals a in someListOfAnimals:
   print a.descripion()

e definire un metodo virtuale "description ()" per Animal e per Bird. Il metodo Bird.description (), ovviamente, stamperà le ali insieme alle solite cose. Animal.description () non menziona wingsize.

Nel caso in cui un giorno ti imbatterai in strane specie di uccelli senza ali, non avrai bisogno di creare una gerarchia di classi aggrovigliate. Il mondo reale è pieno di eccezioni. Basta impostare la dimensione dell'ala a zero, o qualche valore falso, o aggiungere un membro di Bolle con le ali.

    
risposta data 18.03.2013 - 20:12
fonte

Leggi altre domande sui tag