V programovaní je opakovane použiteľný kód použitie existujúceho softvéru na zostavenie nového softvéru pomocou zásad opakovaného použitia. Opätovné použitie kódu sa v podnikoch náročných na informačné technológie považuje za základnú výrobnú funkčnosť. Je podporovaný v objektovo orientovaných systémoch vytváraním vzťahov medzi triedami. Existujú dva základné spôsoby, ako nadviazať tieto vzťahy v objektovo orientovanom programovaní - Dedičstvo a Zloženie. Implementácia dedičstva je jedným zo spôsobov, ako prepojiť triedy, ale OOP poskytuje nový druh vzťahu medzi triedami nazývaný zloženie. Vytvorením vzťahu medzi novými a existujúcimi triedami môže nová trieda zdediť alebo vložiť kód z jednej alebo viacerých existujúcich tried.
V OOP je dedičnosť metodika, pomocou ktorej objekt získava charakteristiky jedného alebo viacerých ďalších objektov. Je to jeden z najúčinnejších nástrojov na implementáciu opakovane použiteľného kódu v OOP. Pri použití dedičstva je možné novú triedu vytvoriť nadviazaním vzťahov rodič-dieťa s existujúcimi triedami. Zloženie objektu je alternatívou k dedičstvu triedy. Použitie objektu v rámci iného objektu sa nazýva zloženie. Pri mnohých príležitostiach by ste chceli použiť objekt ako pole v rámci inej triedy, pretože je ľahké vytvárať zložité triedy s použitím predtým napísaných, dobre navrhnutých tried ako komponentov. Toto sa nazýva zloženie. Dedičnosť aj kompozícia poskytujú v mnohých prípadoch rovnocennú funkčnosť. Zloženie objektu je lepším modelom opätovného použitia ako dedičstvo triedy. Tento článok porovnáva dva prístupy.
Dedičnosť je jedným z najúčinnejších nástrojov pri implementácii opakovaného použitia kódu v objektovo orientovanom programovaní. Vzťahuje sa na funkčnosť, pomocou ktorej jeden objekt získa vlastnosti jedného alebo viacerých ďalších objektov. Dedičnosť v C ++ znamená, že môžete vytvárať triedy, ktoré odvodzujú ich atribúty z existujúcich tried. To znamená, že špecializujete triedu na vytvorenie vzťahu medzi triedami, čo vedie k silnému prepojeniu medzi základnými a odvodenými triedami. Implementácia dedičstva podporuje opätovné použitie kódu, pretože nové triedy sú vytvorené z existujúcich tried. Dedičstvo triedy tiež uľahčuje úpravu opakovaného použitia implementácie. Dedičstvo triedy má však aj niektoré nevýhody. Po prvé, pretože dedičstvo je definované v čase kompilácie, nemôžete zmeniť implementácie zdedené z nadradených tried v čase spustenia..
OOP poskytuje ešte ďalší vzťah medzi triedami, ktorý sa nazýva kompozícia, ktorá je známa aj ako vzťah typu has-a. Ak vlastnosti jedného objektu musia byť súčasťou iného objektu, vzťah vyžaduje zloženie. Na vytvorenie triedy z existujúcich tried by mal byť objekt každej triedy vyhlásený za člena novej triedy. Jednoducho povedané, použitie objektu v inom objekte je známe ako zloženie. Mnohokrát možno budete chcieť použiť objekt ako pole v rámci inej triedy. Môžete použiť objekt v rámci triedy v zložení. Na rozdiel od dedičstva triedy je zloženie objektov definované dynamicky v čase vykonávania pomocou objektov, ktoré získavajú odkazy na iné objekty. Okrem toho kompozícia poskytuje lepší spôsob použitia objektu bez toho, aby došlo k narušeniu vnútorných detailov objektu, to znamená, že kompozícia je užitočná.
Aj keď dedičnosť aj zloženie podporujú opakované použitie kódu v objektovo orientovanom systéme vytváraním vzťahov medzi triedami a poskytujú ekvivalentnú funkčnosť mnohými spôsobmi, používajú rôzne prístupy. S dedičnosťou môžete vytvárať triedy, ktoré odvodzujú ich atribúty z existujúcich tried, takže zatiaľ čo pomocou dedenia na vytvorenie triedy môžete rozbaliť existujúcu triedu. Naopak, použitie objektu v inom objekte je známe ako zloženie. Zloženie objektu je alternatívou k dedičstvu triedy. Ak vlastnosti jedného objektu musia byť súčasťou iného objektu, vzťah vyžaduje zloženie.
V dedičstve špecializujete triedu na vytvorenie vzťahu „is-a“ medzi triedami, čo vedie k silnému prepojeniu medzi základnou a odvodenou triedou. Umožňuje navrhnúť hierarchiu tried a hierarchia začína naj všeobecnejšou triedou a presúva sa do konkrétnejších tried. Implementáciou dedičstva sa členské funkcie z jednej triedy stávajú vlastnosťami inej triedy bez toho, aby ich explicitne kódovali v rámci triedy. V zložení použijete objekt vo vnútri triedy a všetky požiadavky na objekt sa preposielajú do objektu. Vnútorné detaily nie sú navzájom vystavené v zložení, takže ide o vzťah „má a“.
Dedičnosť tried je definovaná v čase kompilácie, takže nemôžete zmeniť implementácie zdedené z nadradených tried v čase spustenia. Pretože dedičstvo vystavuje podtriedu podrobnostiam o implementácii rodičov, často narušuje zapuzdrenie. Akékoľvek zmeny v nadradenej triede sa prejavia v podtriede, čo môže spôsobiť problémy pri pokuse o opätovné použitie podtriedy. Zloženie objektov je naopak dynamicky definované v čase vykonávania pomocou objektov, ktoré získavajú odkazy na iné objekty. A pretože k objektom sa pristupuje iba cez ich rozhrania, nezruší to zapuzdrenie. Akýkoľvek objekt môže byť nahradený za behu iným objektom, pokiaľ má rovnaký typ.
Pri mnohých príležitostiach by ste chceli použiť objekt ako pole v rámci inej triedy, pretože zložité triedy sa dajú ľahšie vytvoriť pomocou predtým napísaných, dobre navrhnutých tried. To je miesto, kde používate zloženie. Dedičnosť poskytuje spôsob opätovného použitia kódu rozšírením triedy s minimálnym úsilím, preto je dedičstvo cenným nástrojom na vytváranie vzťahov medzi triedami. Všeobecne je výhodné použiť kompozíciu, pretože poskytuje spôsob použitia objektu bez toho, aby došlo k narušeniu vnútorných detailov objektu, v ktorom je kompozícia užitočná. Dedičnosť nie je bez problémov, ale ako dedičnosť, zloženie objektov vyvoláva podobné obavy týkajúce sa výkonu, pokiaľ ide o vytváranie a ničenie objektov..