Retribuzione dell'eredità in OOP per modellare una tassonomia della vita reale [duplicato]

3

Esiste un modo per utilizzare le funzionalità esistenti dei linguaggi di programmazione orientati agli oggetti per aggirare il problema di quadrati / rettangoli?

Un bambino può essere definito in termini di sottogruppo più restrittivo della sua classe genitrice anziché essere definito in termini di funzionalità aggiuntive?

Domanda precedente:

Sto provando a conciliare la differenza tra ereditarietà orientata agli oggetti e una tassonomia del mondo reale in cui ogni tipo di bambino ha tratti DIVERSI rispetto ai suoi genitori. L'ereditarietà è sottrattiva. In OO, l'ereditarietà è additiva.

Supponiamo di avere una classe Persona. Una Persona può essere un Cliente, con informazioni di fatturazione, o un Dipendente, assegnato ad un dipartimento. Inoltre un Dipendente può essere un Supervisore con segnalazioni dirette o un Lavoratore con incarichi.

L'ereditarietà OO classica avrebbe ereditato dal Dipendente il lavoratore / supervisore che eredita dalla Persona, dove ogni classe figlio ha più caratteristiche della sua classe genitrice.

Nel mondo reale, però, è il contrario: un mammifero ha molte caratteristiche potenziali, un canino ha un sottoinsieme di quelle caratteristiche e un Beagle ha un sottoinsieme ancora più piccolo.

Un altro modo di guardarlo, un quadrilatero può avere qualsiasi forma con quattro lati. Un parallelogramma è un quadrilatero con lati paralleli. Un rettangolo è un parallelogramma con angoli di 90 gradi e un quadrato è un rettangolo con lati uguali.

Se dovessi modellare una tassonomia del mondo reale usando l'ereditarietà OO, come si farebbe?

Potrei iniziare con un quadrato genitore, con una lunghezza, e il suo bambino essere un rettangolo con una lunghezza e un'altezza, ecc., ma questo è innaturale dato il dominio. C'è un modo per fare che l'ereditarietà di programmazione orientata agli oggetti vada nella direzione opposta?

    
posta ridthyself 31.10.2016 - 18:01
fonte

1 risposta

3

No no no. Stai cercando di risolvere il problema se la radice deve avere più o meno tratti rispetto ai tipi di figlio. Indovina un po? A nessuno importa!

Se sono un utente di mammiferi, ho un certo insieme di messaggi che mi piacerebbe poter inviare un mammifero senza strappare un buco nell'universo. Quindi se dico a un mammifero di volare e si scopre che è un cane, va bene inclinare la testa e guardarmi in modo divertente.

Il modello di oggetto nullo ci salva dal buco nell'universo.

I tratti che un mammifero dovrebbe avere non sono né i tratti di ogni sottotipo né i tratti comuni a ogni sottotipo. Sono i tratti necessari al cliente. Non piu. Niente di meno.

Le persone che affrontano questo problema sono spesso ossessionate dal Principio di sostituzione di Liskov . Questa è una buona cosa da seguire, ma la risposta al problema non c'è. È qui: Principio di segregazione dell'interfaccia

ISP ti dice di non esporre più del necessario per essere usato. Ciò significa che né la radice né i bambini hanno alcuna autorità su ciò che dovrebbe essere esposto. L'utente dei mammiferi è l'unica e sola autorità qui. Tutto il resto è confuso. Progettare una tassonomia senza considerare come verrà utilizzato per primo è una ricetta per il disastro.

    
risposta data 31.10.2016 - 18:54
fonte

Leggi altre domande sui tag