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?