Třída (počítačové programování) - Class (computer programming)

V objektově orientovaném programování je třída rozšiřitelná šablona programového kódu pro vytváření objektů poskytující počáteční hodnoty pro stav ( členské proměnné ) a implementace chování (členské funkce nebo metody ). V mnoha jazycích se název třídy používá jako název třídy (samotná šablona), název výchozího konstruktoru třídy ( podprogram, který vytváří objekty) a jako typ objektů generovaných instancí třídy; tyto odlišné pojmy lze snadno spojit. I když by se dalo až polemizovat, dalo by se namítnout, že jde o rys, který je jazyku vlastní díky jeho polymorfní povaze a proč jsou tyto jazyky tak silné, dynamické a přizpůsobitelné pro použití ve srovnání s jazyky bez přítomnosti polymorfismu. Mohou tak snáze modelovat dynamické systémy (tj. Skutečný svět, strojové učení, AI).

Když je objekt vytvořen konstruktorem třídy, výsledný objekt se nazývá instance třídy a členské proměnné specifické pro objekt se nazývají proměnné instance , aby kontrastovaly s proměnnými třídy sdílenými napříč třídou.

V některých jazycích jsou třídy pouze funkcí kompilace (nové třídy nelze za běhu deklarovat), zatímco v jiných jazycích jsou třídy prvotřídními občany a jsou to obecně samy objekty (obvykle typu Class nebo podobné). V těchto jazycích se třída, která vytváří třídy, nazývá metaclass .

Třída vs. typ

Při běžném používání lidé často odkazují na „třídu“ objektu, ale úzce řečeno objekty mají typ : rozhraní, konkrétně typy členských proměnných, podpisy členských funkcí (metod) a vlastnosti, které tyto vlastnosti uspokojují. Třída má zároveň implementaci (konkrétně implementaci metod) a může s danou implementací vytvářet objekty daného typu. Z hlediska teorie typů je třída implementací - konkrétní strukturou dat a sběrem podprogramů - zatímco typ je rozhraním . Různé (konkrétní) třídy mohou vytvářet objekty stejného (abstraktního) typu (v závislosti na typovém systému); například typ Stack může být implementován se dvěma třídami - SmallStack (rychlý pro malé zásobníky, ale škálovatelný špatně) a ScalableStack (dobře škálovatelný, ale pro malé zásobníky vysoký režijní náklad). Podobně může mít daná třída několik různých konstruktorů.

Typy tříd obecně představují podstatná jména, jako je osoba, místo nebo věc nebo něco nominalizovaného , a třída představuje jejich implementaci. Například Banana typu může představovat vlastnosti a funkce banánů obecně, zatímco ABCBanana a XYZBanana tříd by představovalo způsoby produkující banány (řekněme, dodavatelé banánů či datové struktury a funkce, které reprezentují a čerpat banány ve videohře). Třída ABCBanana by pak mohla produkovat konkrétní banány: instance třídy ABCBanana by byly objekty typu Banana . Často je uvedena pouze jedna implementace typu, v takovém případě je název třídy často shodný s názvem typu.

Návrh a implementace

Třídy se skládají ze strukturálních a behaviorálních složek. Programovací jazyky, které zahrnují třídy jako programovací konstrukci, nabízejí podporu pro různé funkce související se třídou a syntaxe nutná k používání těchto funkcí se v jednotlivých programovacích jazycích značně liší.

Struktura

Zápis UML pro třídy

Třída obsahuje popisy datových polí (nebo vlastnosti , pole , datové členy nebo atributy ). Obvykle se jedná o typy polí a názvy, které budou spojeny se stavovými proměnnými za běhu programu; tyto stavové proměnné buď patří do třídy, nebo do konkrétních instancí třídy. Ve většině jazyků struktura definovaná třídou určuje rozložení paměti používané jejími instancemi. Jsou možné i jiné implementace: například objekty v Pythonu používají asociativní kontejnery klíč-hodnota.

Některé programovací jazyky, jako je Eiffel, podporují specifikaci invarianty jako součást definice třídy a vynucují je prostřednictvím typového systému. Zapouzdření stavu je nezbytné k tomu, aby bylo možné prosadit invarianty třídy.

Chování

Chování třídy nebo jejích instancí je definováno pomocí metod . Metody jsou podprogramy se schopností pracovat s objekty nebo třídami. Tyto operace mohou změnit stav objektu nebo jednoduše poskytnout způsoby přístupu k němu. Existuje mnoho druhů metod, ale jejich podpora se v různých jazycích liší. Některé typy metod jsou vytvářeny a volány programátorským kódem, zatímco jiné speciální metody-například konstruktory, destruktory a operátory převodu-jsou vytvářeny a volány kódem generovaným kompilátorem. Jazyk může také umožnit programátorovi definovat a volat tyto speciální metody.

Koncept rozhraní třídy

Každá třída implementuje (nebo realizuje ) rozhraní poskytováním struktury a chování. Struktura se skládá z dat a stavu a chování se skládá z kódu, který určuje, jak jsou metody implementovány. Existuje rozdíl mezi definicí rozhraní a implementací tohoto rozhraní; tento řádek je však v mnoha programovacích jazycích rozmazaný, protože deklarace tříd definují a implementují rozhraní. Některé jazyky však poskytují funkce, které oddělují rozhraní a implementaci. Například abstraktní třída může definovat rozhraní bez poskytnutí implementace.

Jazyky, které podporují dědičnost tříd, také umožňují třídám dědit rozhraní z tříd, ze kterých jsou odvozeny.

Pokud například „třída A“ dědí z „třídy B“ a pokud „třída B“ implementuje rozhraní „rozhraní B“, pak „třída A“ také dědí funkčnost (deklarace konstant a metod) poskytovanou „rozhraním B“.

V jazycích, které podporují specifikátory přístupu , je rozhraní třídy považováno za sadu veřejných členů třídy, včetně metod i atributů (prostřednictvím implicitních metod getter a setter ); žádní soukromí členové nebo interní datové struktury nejsou určeny k tomu, aby na nich závisel externí kód, a proto nejsou součástí rozhraní.

Objektově orientovaná metodika programování diktuje, že operace jakéhokoli rozhraní třídy mají být na sobě nezávislé. Výsledkem je vrstvený design, kde klienti rozhraní používají metody deklarované v rozhraní. Rozhraní neklade na klienty žádné požadavky na vyvolání operací jednoho rozhraní v jakémkoli konkrétním pořadí. Tento přístup má tu výhodu, že klientský kód může předpokládat, že operace rozhraní jsou k dispozici pro použití, kdykoli má klient přístup k objektu.

Příklad

Tlačítka na přední straně televizoru jsou rozhraním mezi vámi a elektrickým vedením na druhé straně plastového pouzdra. Stisknutím tlačítka „napájení“ zapnete a vypnete televizi. V tomto příkladu je vaší konkrétní televizí instance, každá metoda je reprezentována tlačítkem a všechna tlačítka dohromady tvoří rozhraní (ostatní televizní přijímače, které jsou stejným modelem jako vaše, by měly stejné rozhraní). Ve své nejběžnější formě je rozhraní specifikací skupiny souvisejících metod bez jakékoli související implementace metod.

Televizor má také nespočet atributů , jako je velikost a to, zda podporuje barvy, které dohromady tvoří jeho strukturu. Třída představuje úplný popis televize včetně jejích atributů (struktura) a tlačítek (rozhraní).

Získání celkového počtu vyrobených televizorů by mohlo být statickou metodou televizní třídy. Tato metoda je jasně spojena se třídou, ale je mimo doménu každé jednotlivé instance třídy. Statická metoda, která najde konkrétní instanci mimo množinu všech televizních objektů, je dalším příkladem.

Přístupnost členů

Následuje běžná sada specifikátorů přístupu :

  • Private (nebo class-private ) omezuje přístup k samotné třídě. K soukromým členům mají přístup pouze metody, které jsou součástí stejné třídy.
  • Chráněné (nebo chráněné třídou ) umožňuje samotné třídě a všem jejím podtřídám přístup ke členu.
  • Veřejný znamená, že jakýkoli kód může přistupovat ke členovi pod jeho jménem.

Ačkoli mnoho objektově orientovaných jazyků podporuje výše uvedené specifikátory přístupu, jejich sémantika se může lišit.

Objektově orientovaný design využívá specifikátory přístupu ve spojení s pečlivým návrhem implementací veřejných metod k vynucení invarianty tříd-omezení stavu objektů. Běžným použitím specifikátorů přístupu je oddělení interních dat třídy od jejího rozhraní: vnitřní struktura je soukromá, zatímco veřejné přístupové metody lze použít ke kontrole nebo změně takových soukromých dat.

Specifikátory přístupu nutně neřídí viditelnost , protože i externí členové mohou být viditelní pro externí kód klienta. V některých jazycích může být za běhu odkazováno na nepřístupného, ​​ale viditelného člena (například ukazatelem vráceným z členské funkce), ale pokus o jeho použití odkazem na jméno člena z klientského kódu bude brání kontrola typu.

Různé objektově orientované programovací jazyky v různých stupních vynucují přístupnost a viditelnost členů a v závislosti na typovém systému jazyka a zásadách kompilace vynucené buď při kompilaci, nebo za běhu . Například jazyk Java neumožňuje kompilaci kódu klienta, který přistupuje k soukromým datům třídy. V jazyce C ++ jsou soukromé metody viditelné, ale nejsou přístupné v rozhraní; mohou však být neviditelné výslovným prohlášením plně abstraktních tříd, které představují rozhraní třídy.

Některé jazyky mají další schémata přístupnosti:

  • Instance vs. třída přístupnost : Ruby podporuje instance a soukromého sektoru a instance chráněné specifikátory přístupu namísto třídy a soukromého sektoru a class chráněné, resp. Liší se v tom, že omezují přístup na základě samotné instance, nikoli třídy instance.
  • Friend : C ++ podporuje mechanismus, kde funkce explicitně deklarovaná jako přátelská funkce třídy může přistupovat ke členům označeným jako soukromé nebo chráněné.
  • Path-based : Java podporuje omezení přístupu ke členovi v rámci balíčku Java , což je logická cesta k souboru. Je však běžnou praxí při rozšiřování rámce Java o implementaci tříd ve stejném balíčku jako třídy framework za účelem přístupu k chráněným členům. Zdrojový soubor může existovat ve zcela jiném umístění a může být nasazen do jiného souboru .jar, přesto však bude ve stejné logické cestě, pokud jde o JVM.

Mezitřídní vztahy

Kromě návrhu samostatných tříd mohou programovací jazyky podporovat pokročilejší návrh tříd na základě vztahů mezi třídami. Běžně poskytované možnosti návrhu vztahů mezi třídami jsou kompoziční a hierarchické .

Kompoziční

Třídy mohou být složeny z jiných tříd, čímž se vytvoří kompoziční vztah mezi uzavírající třídou a jejími vloženými třídami. Kompoziční vztah mezi třídami je také běžně známý jako vztah has-a . Například třída „Auto“ může být složena z třídy „Motor“ a obsahovat ji. Proto Car Engine. Jedním aspektem kompozice je zadržování, což je uzavření instancí komponent instancí, která je má. Pokud uzavřený objekt obsahuje instance komponent podle hodnoty, mají komponenty a jejich uzavírací objekt podobnou životnost . Pokud jsou součásti obsaženy formou odkazu, nemusí mít podobnou životnost. Například v Objective-C 2.0:

@interface Car : NSObject

@property NSString *name;
@property Engine *engine
@property NSArray *tires;

@end

Tato třída Car instanci NSString ( objekt řetězce ), Engine a NSArray (objekt pole).

Hierarchický

Třídy lze odvodit z jedné nebo více existujících tříd, čímž se vytvoří hierarchický vztah mezi třídami odvozenými z ( základní třídy , nadřazené třídy nebo nadtřídy ) a odvozené třídy (podřízená třídanebopodtřída). Vztah odvozené třídy k odvozeným třídám je běžně znám jakovztah is-a . Například třída 'Button' může být odvozena ze třídy 'Control'. Tlačítkoje tedyovládací prvek. Strukturální a behaviorální členové nadřazených tříd jsouzděděnipodřízenou třídou. Odvozené třídy mohou definovat další strukturální členy (datová pole) a behaviorální členy (metody) kromě těch, kterédědí,a jsou tedyspecializacíjejich nadtříd. Také odvozené třídy mohoupřepsatzděděné metody, pokud to jazyk umožňuje.

Ne všechny jazyky podporují vícenásobnou dědičnost. Například Java umožňuje třídě implementovat více rozhraní, ale dědí pouze z jedné třídy. Pokud je povolena vícenásobná dědičnost, hierarchie je směrovaný acyklický graf (zkráceně DAG), jinak je to strom . Hierarchie má třídy jako uzly a vztahy dědičnosti jako odkazy. Třídy na stejné úrovni budou pravděpodobněji přidruženy než třídy na různých úrovních. Úrovně této hierarchie se nazývají vrstvy nebo úrovně abstrakce .

Příklad (kód Simplified Objective-C 2.0, z iPhone SDK):

@interface UIResponder : NSObject //...
@interface UIView : UIResponder //...
@interface UIScrollView : UIView //...
@interface UITableView : UIScrollView //...

V tomto příkladu je UITableView je UIScrollView je UIView je UIResponder je NSObject.

Definice podtřídy

Koncepčně je nadtřída nadmnožinou svých podtříd. Hierarchie běžné třídy by například zahrnovala GraphicObject jako nadtřídu Rectangle a Ellipse , zatímco Square by byla podtřída Rectangle . To jsou také všechny podmnožinové vztahy v teorii množin, tj. Všechny čtverce jsou obdélníky, ale ne všechny obdélníky jsou čtverce.

Běžnou koncepční chybou je splést část vztahu s podtřídou. Například osobní a nákladní automobil jsou oba druhy vozidel a bylo by vhodné je modelovat jako podtřídy třídy vozidel. Bylo by však chybou modelovat součásti automobilu jako vztahy podtříd. Například auto se skládá z motoru a karoserie, ale nebylo by vhodné modelovat motor nebo karoserii jako podtřídu automobilu.

V objektově orientovaném modelování jsou tyto druhy vztahů obvykle modelovány jako vlastnosti objektu. V tomto případě by třída Car měla vlastnost s názvem parts . části by byly zadány tak, aby obsahovaly sbírku objektů, jako jsou instance karoserie , motoru , pneumatik atd. Objektové modelovací jazyky, jako je UML, zahrnují schopnosti modelovat různé aspekty „části“ a další druhy vztahů - data jako mohutnost objektů, omezení vstupních a výstupních hodnot atd. Tyto informace mohou vývojářské nástroje využít ke generování dalšího kódu vedle základních definic dat pro objekty, jako je například kontrola chyb při metodách získání a nastavení .

Jednou důležitou otázkou při modelování a implementaci systému tříd objektů je, zda třída může mít jednu nebo více nadtříd. V reálném světě se skutečnými sadami by bylo vzácné najít sady, které se neprotínají s více než jednou další sadou. Zatímco některé systémy, jako jsou Flavours a CLOS, poskytují možnost více než jednomu rodiči za běhu, přináší to složitost, kterou mnozí v objektově orientované komunitě považují za protikladnou vůči cílům používání tříd objektů na prvním místě. Pochopení toho, která třída bude zodpovědná za zpracování zprávy, se může při řešení více než jedné nadtřídy komplikovat. Pokud se tato funkce používá nedbale, může zavést některé stejné třídy složitosti systému a dvojznačnosti, které byly navrženy, aby se zabránilo.

Většina moderních objektově orientovaných jazyků, jako je Smalltalk a Java, vyžaduje za běhu jedinou dědičnost. Pro tyto jazyky může být vícenásobná dědičnost užitečná pro modelování, ale ne pro implementaci.

Nicméně, sémantický web objekty aplikace se mají více nadtřídy. Nestálost internetu vyžaduje tuto úroveň flexibility a technologické standardy, jako je Web Ontology Language (OWL), jsou navrženy tak, aby jej podporovaly.

Podobným problémem je, zda lze hierarchii tříd za běhu upravit či nikoli. Jazyky, jako jsou Flavours, CLOS a Smalltalk, podporují tuto funkci jako součást jejich protokolů metaobjektů . Protože třídy jsou samy prvotřídními objekty, je možné je nechat dynamicky měnit jejich strukturu zasíláním příslušných zpráv. Jiné jazyky, které se více zaměřují na silné psaní, jako je Java a C ++, neumožňují úpravu hierarchie tříd za běhu. Sémantické webové objekty mají schopnost měnit doby běhu tříd. Racionální je podobné odůvodnění pro povolení více nadtříd, že internet je tak dynamický a flexibilní, že ke zvládnutí této volatility jsou nutné dynamické změny v hierarchii.

Ortogonalita třídního konceptu a dědičnost

Ačkoli se běžně předpokládá, že jazyky založené na třídách podporují dědičnost, dědičnost není vnitřním aspektem konceptu tříd. Některé jazyky, často označované jako „ objektové jazyky “, podporují třídy, ale nepodporují dědičnost. Mezi příklady objektově založených jazyků patří dřívější verze jazyka Visual Basic .

V rámci objektově orientované analýzy

V objektově orientované analýze a v UML představuje asociace mezi dvěma třídami spolupráci mezi třídami nebo jejich odpovídajícími instancemi. Sdružení mají směr; například obousměrná asociace mezi dvěma třídami naznačuje, že si obě třídy uvědomují svůj vztah. Sdružení mohou být označena podle jejich názvu nebo účelu.

Role přidružení je dána koncem přidružení a popisuje roli odpovídající třídy. Role „předplatitel“ například popisuje způsob, jakým se instance třídy „Osoba“ účastní asociace „předplatitelů“ se třídou „Časopis“. Ve stejné asociaci má také „časopis“ roli „předplatného časopisu“. Multiplicita asociační role popisuje, kolik instancí odpovídá každé instanci jiné třídy asociace. Běžné násobnosti jsou „0..1“, „1..1“, „1 ..*“ a „0 ..*“, kde „*“ určuje libovolný počet instancí.

Taxonomie tříd

Existuje mnoho kategorií tříd, z nichž některé se překrývají.

Abstrakt a beton

V jazyce, který podporuje dědičnost, je abstraktní třída nebo abstraktní základní třída (ABC) třída, kterou nelze vytvořit, protože je buď označena jako abstraktní, nebo jednoduše určuje abstraktní metody (nebo virtuální metody ). Abstraktní třída může poskytovat implementace některých metod a může také specifikovat virtuální metody prostřednictvím podpisů, které mají být implementovány přímými nebo nepřímými potomky abstraktní třídy. Než lze vytvořit instanci třídy odvozené z abstraktní třídy, musí být všechny abstraktní metody jejích nadřazených tříd implementovány nějakou třídou v řetězci derivací.

Většina objektově orientovaných programovacích jazyků umožňuje programátorovi určit, které třídy jsou považovány za abstraktní, a neumožní jejich instanci. Například v jazycích Java , C# a PHP se používá klíčové slovo abstract . V C ++ je abstraktní třída třída mající alespoň jednu abstraktní metodu danou příslušnou syntaxí v daném jazyce (čistě virtuální funkce v jazyce C ++).

Třída sestávající pouze z virtuálních metod se v jazyce C ++ nazývá Pure Abstract Base Class (nebo Pure ABC ) a uživatelé jazyka ji také označují jako rozhraní . Jiné jazyky, zejména Java a C#, podporují variantu abstraktních tříd nazývanou rozhraní prostřednictvím klíčového slova v jazyce. V těchto jazycích není povolena vícenásobná dědičnost , ale třída může implementovat více rozhraní. Taková třída může obsahovat pouze abstraktní veřejně přístupné metody.

Konkrétní třída je třída, která může být vytvořena , na rozdíl od abstraktní třídy, které nemohou.

Místní a vnitřní

V některých jazycích mohou být třídy deklarovány v jiných oborech, než je globální rozsah. Existují různé typy těchto tříd.

Vnitřní třída je třída, definované v rámci jiné třídy. Vztah mezi vnitřní třídou a její třídou obsahující lze také považovat za jiný typ přidružení třídy. Vnitřní třída obvykle není ani spojena s instancemi uzavírající třídy, ani není vytvořena instance společně s její uzavírající třídou. V závislosti na jazyce může, ale nemusí být možné odkazovat na třídu mimo uzavřenou třídu. Související koncepcí jsou vnitřní typy , známé také jako vnitřní datový typ nebo vnořený typ , což je zobecnění konceptu vnitřních tříd. C ++ je příkladem jazyka, který podporuje vnitřní třídy i vnitřní typy (prostřednictvím deklarací typedef ).

Dalším typem je místní třída , což je třída definovaná v rámci procedury nebo funkce. To omezuje odkazy na název třídy v rámci oboru, kde je třída deklarována. V závislosti na sémantických pravidlech jazyka mohou existovat další omezení pro místní třídy ve srovnání s nelokálními. Jedním z běžných omezení je zakázat metodám místní třídy přístup k místním proměnným uzavírací funkce. Například v jazyce C ++ může místní třída odkazovat na statické proměnné deklarované v rámci její uzavírací funkce, ale nemusí přistupovat k automatickým proměnným funkce .

Metaklasy

Metaclasses jsou třídy, jejichž instance jsou třídy. Metaclass popisuje společnou strukturu kolekce tříd a může implementovat návrhový vzor nebo popsat konkrétní druhy tříd. Metaklasy se často používají k popisu rámců .

V některých jazycích, jako je Python , Ruby nebo Smalltalk , je třída také objektem; každá třída je tedy instancí jedinečné metaclass, která je integrována do jazyka. Common Lisp Object System (CLOS) poskytuje metaobject protokoly (mopy) pro provádění těchto tříd a Metaclasses.

Non-subclassable

Non-subclassable classes allow programmers to design classes and hierarchies of classes where at some level in the hierarchy, further derivation is guaranteed (a stand-alone class can be also identified as non-subclassable, prevent creating the any hierarchy). Kontrastujte to s abstraktními třídami, které implikují, podporují a vyžadují odvození, aby mohly být vůbec použity. Podtřída, která není podtřída, je implicitně konkrétní .

Třída, která není podtřída, je vytvořena deklarováním třídy jako sealedv C# nebo jako finalv Javě nebo PHP. Například Stringtřída Java je označena jako konečná .

Non-subclassable classes may allow a compiler (in compiled languages) to perform optimizations that are not available for subclassable classes.

Otevřená třída

Otevřená třída je ta, kterou lze změnit. Zákazníci obvykle nemohou změnit spustitelný program . Vývojáři mohou často měnit některé třídy, ale obvykle nemohou měnit standardní ani vestavěné. V Ruby jsou všechny třídy otevřené. V Pythonu lze třídy vytvářet za běhu a všechny je možné později upravit. Kategorie Objective-C umožňují programátorovi přidat metody do existující třídy, aniž by bylo nutné tuto třídu překompilovat nebo dokonce mít přístup ke svému zdrojovému kódu.

Mixiny

Některé jazyky mají speciální podporu pro mixiny , ačkoli v jakémkoli jazyce s vícenásobnou dědičností je mixin jednoduše třída, která nepředstavuje vztah typu a typu. Mixiny se obvykle používají k přidání stejných metod do více tříd; například třída UnicodeConversionMixin může poskytovat metodu nazvanou unicode_to_ascii, pokud je zahrnuta ve třídách FileReader a WebPageScraper , které nesdílejí společného rodiče.

Částečný

V jazycích podporujících tuto funkci je částečná třída třída, jejíž definici lze rozdělit na více částí, v rámci jednoho souboru zdrojového kódu nebo mezi více souborů. Kusy jsou sloučeny v době kompilace, takže výstup kompilátoru je stejný jako pro třídu non-partial.

Primární motivací pro zavedení dílčích tříd je usnadnit implementaci generátorů kódu , jako jsou vizuální návrháři . Jinak je výzvou nebo kompromisem vyvinout generátory kódu, které mohou generovaný kód spravovat, když je vložen do kódu napsaného vývojářem. Pomocí parciálních tříd může generátor kódu zpracovat samostatný soubor nebo hrubozrnnou částečnou třídu v souboru, a je tak ulehčen od složitého vkládání generovaného kódu pomocí rozsáhlé analýzy, což zvyšuje efektivitu kompilátoru a eliminuje potenciální riziko poškození vývojářského kódu. V jednoduché implementaci dílčích tříd může kompilátor provést fázi předkompilace, kde „sjednotí“ všechny části dílčí třídy. Potom může kompilace pokračovat jako obvykle.

Mezi další výhody a efekty funkce částečné třídy patří:

  • Umožňuje jedinečné oddělení rozhraní a implementačního kódu třídy.
  • Usnadňuje navigaci ve velkých třídách v editoru .
  • Umožňuje oddělení problémů podobným způsobem jako programování orientované na aspekty, ale bez použití dalších nástrojů.
  • Umožňuje více vývojářům pracovat souběžně na jedné třídě bez nutnosti sloučit jednotlivý kód do jednoho souboru později.

Částečné třídy existují v Smalltalku pod názvem Class Extensions již značnou dobu. S příchodem .NET framework 2 , Microsoft představil částečné třídy, podporované jak v C # 2.0 a Visual Basic 2005 . WinRT také podporuje částečné třídy.

Příklad ve VB.NET

Tento jednoduchý příklad napsaný v jazyce Visual Basic .NET ukazuje, jak jsou části stejné třídy definovány ve dvou různých souborech.

soubor1.vb
Partial Class MyClass
    Private _name As String
End Class
soubor2.vb
Partial Class MyClass
    Public Readonly Property Name() As String
         Get
             Return _name
         End Get
    End Property
End Class

Při kompilaci je výsledek stejný, jako kdyby byly dva soubory zapsány jako jeden, například takto:

Class MyClass
    Private _name As String
    Public Readonly Property Name() As String
         Get
             Return _name
         End Get
    End Property
End Class

Příklad v Objective-C

V Objective-C se částečné třídy, známé také jako kategorie , mohou dokonce rozšířit do více knihoven a spustitelných souborů, jako v následujícím příkladu. Klíčovým rozdílem však je, že kategorie Objective-C mohou přepsat definice v jiné deklaraci rozhraní a že kategorie se nerovná definici původní třídy (první vyžaduje poslední). Částečná třída .NET místo toho nemůže mít konfliktní definice a všechny částečné definice jsou stejné jako ostatní.

V Foundation soubor záhlaví NSData.h:

@interface NSData : NSObject

- (id)initWithContentsOfURL:(NSURL *)URL;
//...

@end

V uživatelem dodávané knihovně samostatný binární soubor z Foundation Framework, hlavičkový soubor NSData+base64.h:

#import <Foundation/Foundation.h>

@interface NSData (base64)

- (NSString *)base64String;
- (id)initWithBase64String:(NSString *)base64String;

@end

A v aplikaci další samostatný binární soubor, soubor zdrojového kódu main.m:

#import <Foundation/Foundation.h>
#import "NSData+base64.h"

int main(int argc, char *argv[])
{
    if (argc < 2)
        return EXIT_FAILURE;
    NSString *sourceURLString = [NSString stringWithCString:argv[1]];
    NSData *data = [[NSData alloc] initWithContentsOfURL:[NSURL URLWithString:sourceURLString]];
    NSLog(@"%@", [data base64String]);
    return EXIT_SUCCESS;
}

Dispečer najde obě metody volané přes instanci NSData a obě vyvolá správně.

Neodstranitelné

Neinstantovatelné třídy umožňují programátorům seskupit pole a metody podle tříd, které jsou přístupné za běhu bez instance třídy. U tohoto druhu třídy je vytváření instancí zakázáno.

Například v C#nelze třídu označenou „statickou“ vytvořit instanci, může mít pouze statické členy (pole, metody, jiné), nemusí mít konstruktory instancí a je zapečetěna .

Bezejmený

Nejmenovaný class nebo anonymní třída je třída, která není vázána na jméno nebo identifikátor při definici. To je analogické s pojmenovanými a nepojmenovanými funkcemi .

Výhody

Výhody organizování softwaru do tříd objektů spadají do tří kategorií:

  • Rychlý vývoj
  • Snadná údržba
  • Opětovné použití kódu a návrhů

Třídy objektů usnadňují rychlý vývoj, protože zmenšují sémantickou mezeru mezi kódem a uživateli. Systémoví analytici mohou mluvit s vývojáři i uživateli pomocí v podstatě stejné slovní zásoby, hovořit o účtech, zákaznících, účtech atd. Objektové třídy často usnadňují rychlý vývoj, protože většina objektově orientovaných prostředí obsahuje výkonné nástroje pro ladění a testování. Instance tříd lze zkontrolovat za běhu a ověřit, že systém funguje podle očekávání. Také většina objektově orientovaných prostředí interpretovala ladicí schopnosti, místo aby získala skládky základní paměti, takže vývojář může přesně analyzovat, kde v programu došlo k chybě, a zjistit, které metody byly volány ke kterým argumentům a s jakými argumenty.

Třídy objektů usnadňují údržbu díky zapouzdření. Když vývojáři potřebují změnit chování objektu, mohou změnu lokalizovat pouze na tento objekt a jeho součásti. Tím se snižuje možnost nežádoucích vedlejších účinků vylepšení údržby.

Opětovné použití softwaru je také hlavní výhodou používání tříd objektů. Třídy usnadňují opětovné použití prostřednictvím dědičnosti a rozhraní. Když je vyžadováno nové chování, lze toho často dosáhnout vytvořením nové třídy a tím, že tato třída zdědí výchozí chování a data její nadtřídy a podle toho pak přizpůsobí určitý aspekt chování nebo dat. K opětovnému použití prostřednictvím rozhraní (také známých jako metody) dochází, když jiný objekt chce vyvolat (nikoli vytvořit nový druh) nějaké třídy objektů. Tato metoda pro opakované použití odstraňuje mnoho běžných chyb, které se mohou dostat do softwaru, když jeden program znovu používá kód od jiného.

Reprezentace za běhu

Jako datový typ je třída obvykle považována za konstrukci v době kompilace. Jazyk nebo knihovna může také podporovat prototypové nebo tovární metaobjekty, které představují běhové informace o třídách, nebo dokonce představují metadata, která poskytují přístup k reflexním zařízením a schopnost manipulovat s formáty datové struktury za běhu. Mnoho jazyků odlišuje tento druh informací o třídách za běhu o třídách od třídy na základě toho, že tyto informace nejsou za běhu potřeba. Některé dynamické jazyky nedělají striktní rozdíly mezi běhovými a kompilačními konstrukcemi, a proto nemusí rozlišovat mezi metaobjekty a třídami.

Pokud je například člověk metaobjekt reprezentující třídu Person, pak instance třídy Person lze vytvořit pomocí zařízení Human metaobject .

Viz také

Poznámky

Reference

Další čtení