objektově orientované programování From Wikipedia, the free encyclopedia
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 se poprvé objevil v jazyce Simula 67.
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í.
(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
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.
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).
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).
Seamless Wikipedia browsing. On steroids.
Every time you click a link to Wikipedia, Wiktionary or Wikiquote in your browser's search results, it will show the modern Wikiwand interface.
Wikiwand extension is a five stars, simple, with minimum permission required to keep your browsing private, safe and transparent.