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
Product
eInventory
, ho rapidamente pensato che unProduct
sia unInventory
perché ancheProduct
deve essere inventato . Ma si è verificato un problema quando l'utente voleva vendere il suo articoloInventory
. Non sembra giusto modificare un oggettoInventory
nel suo sottotipo (Product
), è quasi come provare a convertire un genitore nel suo figlio. -
Un altro caso è
Customer
eMember
. È logico (almeno per me) pensare che unMember
sia unCustomer
con altri privilegi. Lo stesso problema si è verificato quando l'utente desiderava aggiornare unCustomer
esistente 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
Inventory
inProduct
. Qui sto facendo un'ipotesi sul fatto cheProduct
eInventory
stiano 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
Membership
invece che all'interno diCustomer
class invece della precedente soluzione di ereditarietà. Pertanto, l'aggiornamento di unCustomer
consiste solo nell'istanziare la proprietàCustomer
diMembership
. -
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 classeRole
astratta 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!