Supponiamo che stiamo sviluppando alcune applicazioni che ci richiedono di essere in grado di gestire i clienti e che tali clienti possono essere sia persone fisiche che legali. Esistono diversi modi in cui possiamo gestirli e non sono sicuro quale di essi sia il migliore in termini di estensibilità, riutilizzo del codice e così via.
La prima cosa che ho pensato è stata la costruzione di due classi "NaturalCustomer" e "LegalCustomer". Quindi, le proprietà condivise verrebbero spostate su una classe di base "Cliente" e sia NaturalCustomer che LegalCustomer erediterebbero da esso.
La seconda cosa che pensavo era "considerare ogni cliente come una persona naturale e considerare che un cliente di persona legale è solo una persona fisica che ha una o più società". In tal caso creerei una classe "Cliente" e quindi una classe "CustumerCompany". Se ci sono altre società nell'applicazione che condividono proprietà con CustomerCompany, vorrei creare una nuova società di classe e ereditarla. In questo approccio ci sarebbe una relazione zero-a-molti tra Cliente e Azienda: un cliente può avere una o nessuna società.
Non sono sicuro di come affrontare questo tipo di problema. Sto solo iniziando con l'analisi e il design orientato agli oggetti e sono ancora confuso. Il problema principale è che se seleziono il primo approccio, non riusciamo a riutilizzare molto codice. Ad esempio, nell'app potrebbero esserci altri tipi di persone naturali come "Dipendente" e condividerebbe molte proprietà con NaturalCustomer, e lo stesso per le aziende, potrebbero esserci società come "Fornitore" e condividerebbe molte proprietà con LegalCustomer e ancora non lo userei di nuovo, quindi se dovessi apportare una modifica ai dati che dovrebbero essere archiviati per le aziende dovrei cambiare ovunque.
Come affrontiamo questo tipo di situazione quando non è consentita l'ereditarietà multipla (ovvero non posso rendere LegalCustomer ereditare entrambi dal Cliente e dal LegalPerson)?
Grazie mille in anticipo!