V programování je opakovaně použitelný kód použití stávajícího softwaru k vytváření nového softwaru pomocí principů opakovaného použití. Opakovaná použitelnost kódu je považována za základní produktivní funkčnost v podnicích náročných na informační technologie. To je podporováno v objektově orientovaných systémech navázáním vztahů mezi třídami. Existují dva základní způsoby, jak tyto vztahy navázat v objektově orientovaném programování - dědičnost a složení. Implementace dědičnosti je jedním ze způsobů, jak propojit třídy, ale OOP poskytuje nový druh vztahu mezi třídami nazývaný složení. Navázáním vztahu mezi novými a existujícími třídami může nová třída zdědit nebo vložit kód z jedné nebo více existujících tříd.
V OOP je dědičnost metodologie, podle které objekt získává vlastnosti jednoho nebo více dalších objektů. Je to jeden z nejúčinnějších nástrojů pro implementaci opakovaného použití kódu v OOP. Při použití dědičnosti lze novou třídu vytvořit navázáním vztahů rodič-dítě s existujícími třídami. Složení objektu je alternativou ke třídě dědičnosti. Použití objektu v jiném objektu se nazývá složení. Při mnoha příležitostech byste chtěli použít objekt jako pole v jiné třídě, protože je snadné vytvořit složité třídy pomocí dříve napsaných, dobře navržených tříd jako komponent. Tomu se říká složení. Dědičnost i složení poskytují v mnoha případech rovnocennou funkčnost, složení objektu je lepší model opětovného použití než dědičnost třídy. Tento článek porovnává dva přístupy.
Dědičnost je jedním z nejúčinnějších nástrojů při implementaci opakovaného použití kódu v objektově orientovaném programování. Označuje funkčnost, pomocí které jeden objekt získává vlastnosti jednoho nebo více dalších objektů. Dědičnost v C ++ znamená, že můžete vytvářet třídy, které odvozují jejich atributy z existujících tříd. To znamená, že specializujete třídu na vytvoření vztahu is-a mezi třídami, což má za následek silné propojení mezi základní a odvozenou třídou. Implementace dědičnosti podporuje opakované použití kódu, protože nové třídy jsou vytvářeny z existujících tříd. Dědičnost třídy také usnadňuje úpravu opakovaného použití implementace. Ale dědictví třídy má také některé nevýhody. Za prvé, protože dědičnost je definována v době kompilace, nemůžete během implementace změnit implementace zděděné z nadřazených tříd..
OOP poskytuje ještě další vztah mezi třídami nazvaný složení, který je také známý jako vztah has-a. Pokud funkce jednoho objektu musí být součástí jiného objektu, vztah vyžaduje složení. Pro vytvoření třídy z existujících tříd by měl být objekt každé třídy deklarován jako člen nové třídy. Jednoduše řečeno, použití objektu v jiném objektu je známo jako složení. Mnohokrát můžete chtít použít objekt jako pole v jiné třídě. Použijete objekt uvnitř třídy ve složení. Na rozdíl od dědičnosti třídy je složení objektů definováno dynamicky za běhu pomocí objektů získávajících odkazy na jiné objekty. Kompozice navíc poskytuje lepší způsob použití objektu, aniž by byly ohroženy vnitřní detaily objektu, to je místo, kde je kompozice užitečná.
I když dědičnost i složení podporují opakované použití kódu v objektově orientovaném systému navázáním vztahů mezi třídami a poskytují rovnocennou funkčnost mnoha způsoby, používají různé přístupy. S dědičností můžete vytvářet třídy, které odvozují jejich atributy z existujících tříd, takže zatímco pomocí dědičnosti vytvoříte třídu, můžete rozbalit existující třídu. Naopak, použití objektu v jiném objektu se nazývá složení. Složení objektu je alternativou ke třídě dědičnosti. Pokud funkce jednoho objektu musí být součástí jiného objektu, vztah vyžaduje složení.
V dědičnosti specializujete třídu na vytvoření vztahu „is-a“ mezi třídami, což má za následek silné spojení mezi základní a odvozenou třídou. Umožňuje navrhnout hierarchii tříd a hierarchie začíná nejobecnější třídou a přechází do konkrétnějších tříd. Implementací dědičnosti se členské funkce z jedné třídy stávají vlastnostmi jiné třídy, aniž by je explicitně kódovaly v rámci třídy. Ve složení použijete objekt uvnitř třídy a všechny požadavky na objekt jsou předány objektu. Vnitřní detaily nejsou v kompozici navzájem vystaveny, jedná se tedy o vztah „má-a“.
Dědičnost třídy je definována v době kompilace, takže nemůžete změnit implementace zděděné z nadřazených tříd za běhu. Protože dědičnost vystavuje podtřídu podrobnostem implementace rodičů, často narušuje zapouzdření. Jakékoli změny v nadřazené třídě se projeví v podtřídě, což může způsobit problémy při pokusu o opětovné použití podtřídy. Naopak, složení objektů je definováno dynamicky za běhu pomocí objektů získávajících odkazy na jiné objekty. A protože k objektům je přistupováno pouze přes jejich rozhraní, nezruší zapouzdření. Jakýkoli objekt může být nahrazen za běhu jiným objektem, pokud má stejný typ.
Při mnoha příležitostech byste chtěli použít objekt jako pole v jiné třídě, protože složité třídy lze snadno vytvořit pomocí dříve napsaných, dobře navržených tříd. To je místo, kde používáte složení. Dědičnost poskytuje způsob, jak znovu použít kód rozšířením třídy s minimálním úsilím, proto je dědictví cenným nástrojem při navazování vztahů mezi třídami. Obecně je výhodné použít kompozici, protože poskytuje způsob použití objektu, aniž by došlo ke kompromitaci vnitřních detailů objektu, kde je kompozice užitečná. Dědičnost není bez problémů, ale stejně jako dědičnost vyvolává složení objektů podobné obavy týkající se výkonu, pokud jde o vytváření a ničení objektů..