Programování na základě tříd - Class-based programming

Programování třídy bázi , nebo častěji třídy orientace , je styl objektově orientovaného programování (OOP), ve kterých dědičnost dochází prostřednictvím definování třídy z objektů , namísto dědičnost dochází přes objekty sám (srovnej programování prototyp bázi ).

Nejpopulárnějším a nejrozvinutějším modelem OOP je model založený na třídě, namísto modelu založeného na objektech. V tomto modelu jsou objekty entity, které kombinují stav (tj. Data), chování (tj. Procedury nebo metody ) a identitu (jedinečná existence mezi všemi ostatními objekty). Struktura a chování objektu jsou definovány třídou , což je definice nebo plán všech objektů určitého typu. Objekt musí být explicitně vytvořen na základě třídy a takto vytvořený objekt je považován za instanci této třídy. Objekt je podobný struktuře s přidáním ukazatelů metod, řízení přístupu členů a implicitního datového člena, který lokalizuje instance třídy (tj. Objekty třídy) v hierarchii tříd (zásadní pro funkce dědičnosti za běhu).

Zapouzdření

Zapouzdření brání uživatelům v rozbíjení invariantů třídy, což je užitečné, protože umožňuje změnu implementace třídy objektů pro aspekty, které nejsou vystaveny v rozhraní, bez dopadu na kód uživatele. Definice zapouzdření se zaměřují spíše na seskupování a balení souvisejících informací ( soudržnost ) než na bezpečnostní problémy. Jazyky OOP obvykle nenabízejí formální bezpečnostní omezení pro stav vnitřního objektu. Použití metody přístupu je pro návrh rozhraní věcí konvence.

Dědictví

V programování založeném na třídě se dědění provádí definováním nových tříd jako rozšíření stávajících tříd: stávající třída je nadřazená třída a nová třída je podřízená třída . Pokud podřízená třída má pouze jednu nadřazenou třídu, je to známé jako jedna dědičnost , zatímco pokud podřízená třída může mít více než jednu nadřazenou třídu, je to známé jako vícenásobná dědičnost . To organizuje třídy do hierarchie , buď strom (pokud jde o jednoduchou dědičnost), nebo mřížku (pokud jde o vícenásobnou dědičnost).

Charakteristickým rysem dědičnosti je, že se dědí rozhraní i implementace; pokud se dědí pouze rozhraní, je to známé jako dědičnost rozhraní nebo podtyp. Dědičnost lze také provést bez tříd, jako v programování založeném na prototypech .

Kritika třídních modelů

Jazyky založené na třídách, nebo, přesněji řečeno, na stroji , kde podtřídy jsou jediným způsobem podtypování , byly kritizovány kvůli záměně implementací a rozhraní-základní princip objektově orientovaného programování. Kritici říkají, že je možné vytvořit třídu tašek, která ukládá sbírku předmětů, a poté ji rozšířit tak, aby vytvořila novou třídu nazývanou množina tříd, kde bude odstraněna duplikace objektů. Nyní funkce, která přebírá objekt třídy bag, může očekávat, že přidáním dvou objektů se zvětší velikost vaku o dva, ale pokud jeden projde objekt sady třídy, přidání dvou objektů může nebo nemusí zvětšit velikost pytel po dvou. Problém nastává právě proto, že podtřídy znamenají podtypování i v případech, kdy princip podtypování, známý jako liskovský substituční princip , neplatí. Barbara Liskov a Jeannette Wing formulovaly princip stručně v dokumentu z roku 1994 takto:

Požadavek podtypu : Budiž vlastnost prokazatelná ohledně objektů typu . Pak by to mělo platit pro objekty typu, kde je podtyp .

Normálně je tedy třeba rozlišovat podtypy a podtřídy. Většina současných objektově orientovaných jazyků rozlišuje podtypování a podtřídy, některé přístupy k návrhu však nikoli.

Dalším běžným příkladem je, že objekt osoby vytvořený z podřízené třídy se nemůže stát předmětem nadřazené třídy, protože podřízená třída a nadřazená třída dědí třídu osob, ale jazyky založené na třídách většinou neumožňují změnit druh třídy objekt za běhu. U jazyků založených na třídě je toto omezení zásadní, aby byl zachován jednotný pohled na třídu pro její uživatele. Uživatelé by se neměli starat o to, zda některá z implementací metody nezpůsobí změny, které narušují invarianty třídy. Takové změny lze provést zničením objektu a postavením jiného na jeho místo. Polymorfismus lze použít k zachování příslušných rozhraní, i když jsou takové změny provedeny, protože objekty jsou považovány za abstrakce černé skříňky a jsou přístupné prostřednictvím identity objektu . Obvykle se však změní hodnota odkazů na objekt odkazujících na objekt, což způsobí efekty na kód klienta.

Ukázkové jazyky

Ačkoli Simula představila abstrakci třídy, kanonickým příkladem jazyka založeného na třídě je Smalltalk . Mezi další patří PHP , C ++ , Java , C# a Objective-C .

Viz také

Reference