Mi sto interrogando sulle differenze tra ereditarietà e composizione esaminate con argomenti concreti relativi al codice.
In particolare il mio esempio era:
Inheritance :
class Do:
def do(self):
self.doA()
self.doB()
def doA(self):
pass
def doB(self):
pass
class MyDo(Do):
def doA(self):
print("A")
def doB(self):
print("B")
x=MyDo()
vs Composizione :
class Do:
def __init__(self, a, b):
self.a=a
self.b=b
def do(self):
self.a.do()
self.b.do()
x=Do(DoA(), DoB())
(Nota per la composizione mi manca il codice quindi non è effettivamente più breve)
Puoi citare particolari vantaggi dell'uno o dell'altro?
Penso a:
-
La composizione
- è utile se prevedi di riutilizzare DoA () in un altro contesto
- l'ereditarietà sembra più facile; nessun riferimento / variabile / inizializzazione aggiuntivi Il metodo
- doA può accedere alla variabile interna (che sia una cosa buona o cattiva :))
- logica di gruppi ereditari A e B insieme; anche se potresti ugualmente introdurre un oggetto delegato raggruppato
- l'ereditarietà fornisce una classe preimpostata per gli utenti; con la composizione dovresti incapsulare l'inizializzazione in una fabbrica in modo che l'utente debba assemblare la logica e lo scheletro
- ...
In sostanza vorrei esaminare le implicazioni dell'ereditarietà rispetto alla composizione . Ho sentito spesso la composizione è preferita , ma mi piacerebbe capirlo con l'esempio.
Naturalmente posso sempre iniziare da uno e rifattorizzare più tardi.