Poznáváme C# a Microsoft .NET – 7. díl

V tomto díle si ještě doplníme znalosti související s modelováním tříd a seznámíme se s konstantami a proměnnými pouze pro čtení.

Uzavřené třídy

Uzavřené třídy se používají v případě, chceme-li zabránit tomu, aby třída byla použita jako bázová třída. Smyslem jejich použití je zabránit nežádoucímu odvozování nových tříd. Uzavřená třída se deklaruje pomocí klíčového slova sealed.

public sealed class UzavrenaTrida
{
 //definice třídy
}

V případě pokusu o odvození nové třídy z této třídy dojde při kompilaci k chybě.

//chybny priklad
public class PotomekUzavrene : UzavrenaTrida
{
 //definice třídy
}

Privátní konstruktory

Použití privátních konstruktorů představuje v jazyku C# cestu k zabránění vytvoření instance dané třídy. To se může hodit v situacích kdy třída obsahuje pouze statické členy, protože pokud tomu tak je, není vůbec třeba instance takovéto třídy vytvářet. Následující příklad ukazuje možné využití.

public class MatematickeKonstanty
{
 public static double Pi = 3.1415926535;
 //tim ze implicitni konstruktor deklarujeme jako privatni,
 //nebude mozne vytvaret instance teto tridy
 private MatematickeKonstanty(){}
}

Následný pokus o vytvoření instance této třídy by skončil chybou.

//chyba
MatematickeKonstanty instanceMatem = new MatematickeKonstanty();

Poznámka: Další účinek použití privátního konstruktoru je nemožnost použít danou třídu jako bázovou, poněvadž každá třída při svém instancování volá implicitní konstruktor svých předků, což by v tomto případě nebylo možné.

Specifikátor přístupu internal

Specifikátor přístupu internal poskytuje možnost jak zviditelnit třídu nebo členy třídy širší množině tříd a současně zamezit viditelnosti pro všechny třídy. Tento specifikátor přístupu je předurčen pro psaní pomocných tříd respektive členů, které by měli být skryty koncovému uživateli tříd. Použití specifikátoru přístupu internal má za následek to, že třída nebo člen jsou viditelné pouze v rámci assembly, což je, jak jsem dříve uvedl v některém z předchozích dílů, knihovna DLL, v níž se ve zkompilované podobě (do metajazyku CIL) nacházejí třídy patřící do stejného jmenného prostoru.

//deklarace interni tridy
internal class InterniTrida
{
}

public class TridaInterniClen
{
 //deklarace interniho clenu
 internal int interniClen; 
 public int VerejnyClen; 
}

V případě, že použijeme tento specifikátor přístupu v kombinaci se specifikátorem protected bude člen třídy viditelný všem odvozeným třídám ve stejné assembly.

Vnořené třídy

V některých případech může být užitečné vložit nějakou třídu dovnitř jiné třídy. Je to zpravidla vhodné, když se jedná o nějakou pomocnou třídu, která má být využita pouze ve třídě ve které je vložena. Za tímto účelem nám jsou v jazyku C# k dispozici vnořené třídy. Vnořené třídy také, kromě výše uvedeného důvodu, zvyšují čitelnost kódu a poskytují prostředek k lepší organizaci hierarchie tříd.

Následující příklad ukazuje jak by se problém pomocné třídy řešil bez použití vnořené třídy.

public class HlavniTrida
{
 private PomocnaTrida instancePomocna1;
}
public class PomocnaTrida
{
 //definice pomocne tridy
}

Toto řešení by samozřejmě bylo funkční, ale nebylo by správné, protože pomocná třída by byla přístupná všem ostatním třídám. O něco lepší by bylo pokud by pomocná třída měla specifikátor přístupu internal. Ale i tak by byla přístupná ostatním třídám v assembly, což je také nežádoucí. Pokud pomocnou třídu vnoříme do hlavní třídy jsme schopni ji skrýt před ostatními třídami a zviditelnit ji pouze hlavní třídě, která ji jako jediná potřebuje.

public class HlavniTrida
{
 private PomocnaTrida instancePomocna1;
 //vnitrni trida
 private class PomocnaTrida
 {
  //definice pomocne tridy
 }
}

Přístup k vnořeným třídam lze podobně jako u členů řídit pomocí specifikátorů přístupu. Díky tomu tedy lze deklarovat vnořenou pomocnou třídu jako soukromou(private) a zamezit viditelnosti z ostatních tříd. Pokud chceme z nějakého důvodu zviditelnit vnořenou třídu určité množině ostatních tříd, použijeme odpovídající specifikátor přístupu. Takže změníme-li příklad do této podoby:

public class HlavniTrida
{
 private PomocnaTrida instancePomocna1;
 //deklarace vnorene tridy
 public class PomocnaTrida
 {
  //definice pomocne tridy
 }
}

..budeme schopni k této třídě přistupovat jako ke každému veřejnému členu.

HlavniTrida.PomocnaTrida instancePomocna = new HlavniTrida.PomocnaTrida();

Vyjádření vnitřních tříd v notaci vizuálního modelovacího jazyku UML je znázorněno na obrázku níže.

Klepněte pro větší obrázek

Třídy nejsou jediný typ který lze vnořovat. Kromě tříd lze vnořovat i rozhraní, struktury a výčtové typy.

Poznámka: Pojmy struktura a výčtový typ nebyli v seriálu ještě uvedeny a budou vysvětleny později.

Konstanty

V jazyku C# je možné definovat hodnoty jako konstanty. Aby hodnota mohla být konstantou, musí být v takovém tvaru, který lze zapsat v podobě konstanty. To s sebou přináší omezení v podobě možnosti definovat konstanty pouze pro vestavěné typy, které takto mohou být vyjádřeny.

K vyjádření konstanty slouží v jazyku C# klíčové slovo const. Konstantám je při jejich deklaraci přiřazena hodnota, která později nemůže být změněna. Každá konstanta je automaticky statický člen.

Příklady konstant:

public class TridaKonstanty
{
 public const int ciselnaKonstanta = 10;
 public const string retezcovaKonstanta = "slovo";
}

Proměnné pouze pro čtení

Kvůli tomu, že použití konstant je omezeno pouze na několik vestavěných typů, nelze konstanty v řadě situací použít. Mějme například třídu zaměstnanec. Pokud bysme v nějaké třídě chtěli nadefinovat konstantu tohoto typu, překlad programu by skončil chybou, protože třída zaměstnanec nemůže být vyjádřena jako konstanta.

public class Zamestanec
{
 //definice tridy zamestnanec
}
//nefunkcni priklad
public class TridaKonst
{
 public const Zamestanec zamKonst = new Zamestanec();
}

Pro tyto situace je v jazyku C# možnost definovat takzvané read-only proměnné, neboli proměnné pouze pro čtení. Ty s sebou omezení konstant již nenesou. Těmto proměnným lze hodnotu nastavit v konstruktoru nebo v inicializační deklaraci, ale později ji nelze změnit.

Použití proměnné pouze pro čtení demonstruje následující příklad:

public class Zamestanec
{
  //definice tridy zamestnanec
}
public class TridaReadOnly
{
 public static readonly Zamestanec zam;
 //staticky konstruktor
 static TridaReadOnly()
 {
  //prirazeni hodnoty, pozdeji ji jiz nelze zmenit
zam = new Zamestanec(); 
 }
}

V příštím díle se budeme zaobírat logickými operátory a příkazy pro větvení programu.

Diskuze (12) Další článek: Opera byla pro školy za dolar drahá, dostanou ji zdarma

Témata článku: Software, Microsoft, Programování, Public, Uzavřená množina, Následný pokus, Private, Díl


Určitě si přečtěte

Portál občana už funguje. Na státní web vypadá až překvapivě použitelně

Portál občana už funguje. Na státní web vypadá až překvapivě použitelně

** Portál občana už funguje, vyřídíte na něm první požadavky ** Funkce se budou postupně rozšiřovat ** Web je docela moderní a přehledný

David Polesný | 65

Budoucnost elektroniky: čeští vědci stojí za revolučním čipem, který nemá ve světě obdoby

Budoucnost elektroniky: čeští vědci stojí za revolučním čipem, který nemá ve světě obdoby

** Čeští vědci pod vedením Tomáše Jungwirtha vyvíjí nový typ revolučního paměťového čipu ** Zatímco v současnosti elektronika pracuje s elektrony, v budoucnu to budou spiny elektronů ** Čipy budou moci být klidně i 1 000x rychlejší a úspornější

Karel Javůrek | 32

Apple: naše mapy budou nejlepší na světě. Tajně jsme na nich pracovali několik let

Apple: naše mapy budou nejlepší na světě. Tajně jsme na nich pracovali několik let

** Apple odhalil své plány na zcela nové mapy ** Několik let pracuje na nových mapách, které by měly předběhnout konkurenci ** Objeví se s příchodem iOS 12 pro vybrané státy

Karel Javůrek | 50

Takhle zemřete, když asteroid dopadne na vaše město

Takhle zemřete, když asteroid dopadne na vaše město

** Jak by to dopadlo, kdyby na světovou metropoli či do nedalekého moře dopadl velký asteroid? ** Simulovali to odborníci z University of Southampton ** Výsledky jsou velmi zajímavé

Petr Kubala | 32

15 věcí, které umí Windows 10, ale možná o nich vůbec nevíte

15 věcí, které umí Windows 10, ale možná o nich vůbec nevíte

** Systém Windows 10 umí spoustu užitečných drobností ** O mnoha praktických funkcích pravděpodobně ani nevíte ** Poznejte užitečné tipy, které se vám mohou hodit každý den

Vladislav Kluska | 36


Aktuální číslo časopisu Computer

Velký test 18 bezdrátových sluchátek

Vše o přechodu na DVB-T2

Procesory AMD opět porážejí Intel

7 NVMe M.2 SSD v přímém souboji