Nasledjivanje i kompozicija objekata

Nasledjivanje i kompozicija objekta predstavljaju dve tehnike za ponovno korišćenje objekata u objektno orjentisanim sistemima. Nalseđivanje klasa omogućava da implementacija podklase bude definisana u okviru roditeljske klase. Ovaj tip ponovnog korišćenja se često naziva bela kutija. Ovaj pojam se odnosi na činjenicu da sa nasleđivanjem implementacija roditeljske klase često bude vidljiva podklasi.

Objekti koji se kreiraju kompozicijom drugih objekata kreiraju se tako da ostvare dodatnu funkcionalnost. Ovaj pristup zahteva da objekti imaju dobro definisane interfejse jer su unutrašnji delovi objekata nepoznati. Pošto se objekti tretiraju kao crne kutije ovakav način ponovnog korišćenja se naziva “black box reuse”.

Svaki od ova dva načina ima svojih prednosti ali i mana. Prednost nasleđivanja klasa je to što se sve dešava statički u trenutku kompajliranja i jer je jednostavan za korišćenje. Mana nasleđivanja klasa je to što se na ovaj način dobijaju klase koje postaju zavisne od implementacije roditeljske klase. Na ovaj način teško je da se nasleđene klase ponovo koriste naročito ako deo koda roditeljske implementacije više nije poželjan. Ovo otežava ponovno korišćenje izvedenih klasa, „nasleđivanje razbija enkapsulaciju“. Jedan način da se zaobiđe ovaj problem jeste nasleđivanje samo apstraktnih klasa. Drugi problem sa nasleđivanjem klasa je to što se implementacija nasleđena od roditeljske klase ne može menjati u vremenu izvršavanja.

Kod pristupa objektne kompozicije, funkcionalnost se ostvaruje u vremenu izvršavanja na taj način što objekti ostvaruju i čuvaju reference ka drugim objektima. Prednost ovog pristupa da se implementacija može zameniti u vremenu izvršavanja. Ovo je moguće jer objektima se pristupa samo preko njihovih interfejsa, tako da se lako jedan objekat može zameniti sa drugim dogod imaju isti tip. Kao još jedna pogodnost ovakvog pristupa, javlja se manja implementaciona zavisnost između objekata. Mana je slaba čitljivost ovako napisanog koda, jer se za ostvarivanje veoma dinamičnih struktura zahteva da razičiti objekti rade zajedno.

Uopšte kompozicija objekata ima prednost nad nasleđivanjem. Ona promoviše manje, fokusiranjije klase i manje hijerarhije nasleđivanja. Većina programera preteruje sa korišćenjem nasleđivanja, i to rezultuje u obimnim hijerarhijskim strukutrama koje se teško održavaju. Ponašanje tako postavljenog sistema zavisi više od međusobnog odnosa između objekata nego od ponašanja koje je definisano u pojedinim klasama.

Međutim nasleđivanje je i dalje potrebno. Ne može se uvek ostvariti potrebna funkcionalnost samo sa uklapanjem postojećih komponenti. Ovo se dešava jer „skup postojećih komponenti nikada nije dovoljno bogat kada se koristi u praksi”. Nasleđivanje se koristi da se naprave nove komponente koje se mogu kasnije uklapati od postojećih starih komponenti.

Zbog fleksibilnosti i snage koju pruža objektna kompozicija većina dizajn paterna koristi upravo ovaj način pre nego nasleđivanje kad god je to moguće.