Dědičnost (objektově orientované programování)

Z Wikipedie, otevřené encyklopedie
Skočit na: Navigace, Hledání
Tento článek pojednává o dědičnosti v objektově orientovaném programování. O biologické dědičnosti pojednává článek Dědičnost.

Dědičnost je v objektově orientovaném programování způsob, jak ustanovit is-a vztah mezi objekty. V třídové dědičnosti, kde jsou objekty definované třídami, mohou třídy zdědit atributy a chování od předem existujících tříd, které se nazývají rodičovské třídy, základní třídy nebo super třídy. Výsledné třídy jsou nazývány odvozené třídy, podtřídy nebo potomek třídy. Koncept dědičnosti byl poprvé zaveden pro jazyk Simula v roce 1968.

Podtřídy a super třídy[editovat | editovat zdroj]

Podtřída je modulární, odvozená třída, která dědí jednu nebo více jazykových entit od jedné nebo více tříd (super tříd). Sémantika dědičnosti se v různých programovacích jazycích liší, ale obvykle podtřída dědí instanční proměnné a členské funkce svého rodiče. Některé jazyky podporují dědičnost i jiné konstrukce. Rodičovská třída zavádí společné rozhraní a základní funkcionalitu, kterou specializovaná podtřída může zdědit, modifikovat nebo potlačit. Reference na třídu, může odkazovat na jednu z jeho podtříd. Jaká třída je odkazována je nemožné předpovídat během kompilace. Pro volání funkcí objektů více různých tříd je použito uniformní rozhraní.

Přetěžování[editovat | editovat zdroj]

Mnoho objektově orientovaných jazyků dovoluje objektu nebo třídě nahrazení funkce, která byla zděděná. Tento proces je nazýván přetěžování. Toto přináší komplikaci: kterou verzi funkce instance zděděné třídy používá – tu co je součástí vlastní třídy, nebo tu co je z rodičovské třídy? Odpověď se liší jazyk od jazyka, nějaké jazyky obsahují deklarace pro určení, že určité metody nemohou být přetíženy, některé obsahují deklarační slova pro označení přetížených metod.

Dědičnost je mechanizmus kde podtřída znovu použije kód rodičovské třídy. V základu si podtřída zachovává všechny operace rodičovské třídy.

V následujícím příkladu v jazyce Python, podtřída CubeSumComputer přepisuje metodu transform() rodičovské třídy SquareSumComputer. Podtřída znovu používá všechen kód rodičovské třídy, až na metodu transform().

class SquareSumComputer:
    def __init__(self, a, b):
        self.a = a
        self.b = b
 
    def transform(self, x):
        return x * x
 
    def inputs(self):
        return range(self.a, self.b)
 
    def compute(self):
        return sum(self.transform(value) for value in self.inputs())
 
class CubeSumComputer(SquareSumComputer):
    def transform(self, x):
        return x * x * x

Třídy, které nelze dědit[editovat | editovat zdroj]

V některých programovacích jazycích může být třída prohlášena za neděditelnou přidáním modifikátorů do deklarace třídy. Například v jazyce Java klíčové slovo „final“, nebo v jazyce C# slovo „sealed“. Podobné modifikátory se v deklaraci píší před slovo „class“. Tyto třídy zakazují jejich znovupoužitelnost, což se používá převážně v případě, že se kód distribuuje jako předkompilované binární soubory a ne jako zdrojový kód.

Metody, které nemohou být přetíženy[editovat | editovat zdroj]

Stejně jako třídy mohou být neděditelné, metody/funkce mohou být vyhlášeny za nepřetížitelné (nahrazeny novou funkcí stejného jména v podtřídě). Metody deklarované jako private jsou nepřetížitelné jednoduše proto, že nejsou přístupné z jiných tříd než jejich hlavní. Pro nepřetížitelné funkce (které jsou dostupné potomkům) se používají stejná klíčová slova jako u třídy (final, sealed).

Virtuální metody[editovat | editovat zdroj]

Pokud je metoda v rodičovské třídě deklarovaná jako virtuální, potom její volání z rodičovské třídy bude automaticky přesměrováno na metodu potomka (pokud existuje). Některé jazyky požadují, aby byly virtuální funkce specificky deklarovány (C++), v jiných jazycích jsou všechny metody virtuální (Java).

Reference[editovat | editovat zdroj]

V tomto článku byl použit překlad textu z článku Inheritance (object-oriented programming) na anglické Wikipedii.