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

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

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řekrytí

(angl. overriding) Mnoho objektově orientovaných jazyků dovoluje objektu nebo třídě nahrazení funkce, která byla zděděná. Tento proces je nazýván překrytí.[1][2] 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řekryty, některé obsahují deklarační slova pro označení překrytý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

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řekryty

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

Virtuální metody

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

  1. PECINOVSKÝ, Rudolf. Java 7: učebnice objektové architektury pro začátečníky. Praha : Grada, 2012. S. 278 Dostupné online.
  2. PROCHÁZKA, David. Základy programování objektových aplikací v C++ (ESF). Brno : Mendelova univerzita v Brně. kap. Dědičnost, část Přetížení a překrytí metody Dostupné online.

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