OOP e classe che ereditano da molte classi

-3

In OOP, è possibile avere una classe che eredita da più altre classi? E se sì, come si chiama questa situazione?

Ad esempio, supponiamo di avere le seguenti classi:

Eye
Nose
Mouth
Eyebrow
Ear
Hair
Skin

Ora voglio avere una classe chiamata Face che dovrebbe ereditare o dipendere da tutte queste classi per creare un oggetto Face . In altre parole, voglio riunire molte classi in una classe.

    
posta SaidbakR 10.10.2018 - 21:51
fonte

3 risposte

6

Quando inizi a imparare su OOP, una delle prime cose che devi imparare è preferire la composizione sull'ereditarietà .

Nel tuo esempio, una faccia ha occhi, bocca, orecchie, .... Quando un oggetto di una classe assembla oggetti da altre classi in quel modo, si chiama composizione . Questo è ciò di cui hai bisogno.

Detto questo, e per soddisfare la tua curiosità su eredità :

  • l'ereditarietà è una relazione molto speciale che dovrebbe significare è-a : un Dog è-un Animal , quindi può ereditarlo.
  • la maggior parte delle lingue OOP consente ereditarietà multilivello , in cui una classe eredita da un'altra classe con eredita da una terza: una GermanShepherd eredita da Dog che eredita da Animal .
  • alcune lingue OOP consentono ereditarietà in cui una classe può ereditare da molte altre (esempio: un Dog potrebbe ereditare da Pet e avere un metodo showAffection() , e allo stesso tempo ereditare da Animal e avere un metodo findFood() .
  • molti linguaggi OOP non forniscono ereditarietà multipla, ma propongono il concetto di interfaccia per ottenere effetti simili. (La differenza principale è che la classe deve implementare se stessa i comportamenti promessi dalle sue molteplici interfacce).
risposta data 10.10.2018 - 22:02
fonte
3

Vuoi la composizione, non l'ereditarietà. Ecco una buona panoramica di Ereditarietà rispetto alla composizione.

Per elaborare, l'ereditarietà rappresenta una possibile relazione "è una". Ad esempio, se si dispone di una classe Lettera, la lettera particolare M "è-a" lettera. Se hai una classe di veicolo, "Audi A4" è un'auto, che potrebbe essere una sottoclasse di veicoli. (anche se potresti non volere ereditarietà qui, YMMV)

Composition rappresenta una relazione "ha a". Il mio garage non è un'auto, ma "ha una" macchina. "Audi" non è una lettera, ma ha un (mazzo di) lettere.

Nel tuo esempio, nessuno direbbe che la faccia è "un occhio". Ma "ha" 0, 1 o 2 occhi.

La "migliore pratica" moderna è quella di favorire la composizione sull'ereditarietà, quindi, quando dubita, non sottoclassi.

    
risposta data 10.10.2018 - 22:23
fonte
0

[Questo è in aggiunta alla risposta di @ Christophe.]

In OOP, is it possible to have a class inherits from another multiple classes? and if it is true, what is the term of this situation?

Il termine per ciò che viene proposto nella domanda originale è ereditarietà . Ai fini di questa conversazione, l'ereditarietà può essere suddivisa in due versioni: ereditarietà dell'implementazione e ereditarietà dell'interfaccia . Quasi nessuna lingua OO supporta l'ereditarietà multipla dell'implementazione, perché raramente può essere implementata correttamente. Molti linguaggi OO supportano l'ereditarietà dell'implementazione singola e l'ereditarietà dell'interfaccia multipla.

    
risposta data 10.10.2018 - 22:17
fonte

Leggi altre domande sui tag