So che potrei avere downvoted per questo, ma sono davvero curioso.
Mi è stato insegnato che l'ereditarietà è uno strumento di polimorfismo molto potente, ma non riesco a usarlo bene in casi reali.
Finora, posso usare l'ereditarietà solo quando la classe base è una classe astratta.
Esempi:
-
Se parliamo di
ProducteInventory, ho rapidamente pensato che unProductsia unInventoryperché ancheProductdeve essere inventato . Ma si è verificato un problema quando l'utente voleva vendere il suo articoloInventory. Non sembra giusto modificare un oggettoInventorynel suo sottotipo (Product), è quasi come provare a convertire un genitore nel suo figlio. -
Un altro caso è
CustomereMember. È logico (almeno per me) pensare che unMembersia unCustomercon altri privilegi. Lo stesso problema si è verificato quando l'utente desiderava aggiornare unCustomeresistente per diventareMember. -
Un caso molto banale è il caso
Employee. DoveManager,Clerk, ecc. Possono essere derivati daEmployee. Ancora, lo stesso problema di aggiornamento.
Ho provato a utilizzare la composizione per alcuni casi, ma volevo davvero sapere se mi manca qualcosa per la soluzione di ereditarietà.
La mia soluzione di composizione per questi casi:
-
Crea un riferimento di
InventoryinProduct. Qui sto facendo un'ipotesi sul fatto cheProducteInventorystiano parlando in un contesto diverso. MentreProductè nel contesto delle vendite (prezzo, volume, sconto, ecc.),Inventoryè nel contesto della gestione fisica (stock, movimento, ecc.) -
Crea un riferimento di
Membershipinvece che all'interno diCustomerclass invece della precedente soluzione di ereditarietà. Pertanto, l'aggiornamento di unCustomerconsiste solo nell'istanziare la proprietàCustomerdiMembership. -
Questo esempio continua a essere insegnato nelle classi di programmazione di base, ma penso che sia più corretto avere quei
Manager,Clerk, ecc derivati da una classeRoleastratta e renderli una proprietà inEmployee.
Ho trovato difficile trovare un esempio di classe concreta derivante da un'altra classe concreta.
Esiste una soluzione di ereditarietà in cui posso risolvere questi casi?
Essendo nuovo in questa cosa OOP, ho davvero bisogno di una guida.
Grazie!