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.

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

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

Velká podzimní aktualizace Windows 10 je tady: Co přináší Fall Creators Update

Velká podzimní aktualizace Windows 10 je tady: Co přináší Fall Creators Update

** Po půl roce je tu další aktualizace Windows ** A opět přináší hlavně hromadu drobných kosmetických vylepšení ** Podívali jsme se na ty nejzajímavější

17.  10.  2017 | Jakub Čížek | 176

Budoucností Windows 10 je Fluent Design. Takto bude jednou vypadat celý systém

Budoucností Windows 10 je Fluent Design. Takto bude jednou vypadat celý systém

** Fluent Design je vzhled, do kterého postupně Microsoft převleče celý systém ** Staví na průhlednosti a velkých plochách ** Do Windows 10 se z části dostane už zítra při vydání podzimní aktualizace

16.  10.  2017 | Stanislav Janů | 154

Nejlepší optické iluze: Z toho vám půjde hlava kolem

Nejlepší optické iluze: Z toho vám půjde hlava kolem

** Mozek se nechá snadno ošálit, a to mnoha způsoby ** Podívejte se na několik nejlepších optických iluzí ** Iluze dokazují, že vnímání reality může být značně zkreslené

16.  10.  2017 | Vojtěch Malý


Aktuální číslo časopisu Computer

Nový seriál o programování elektroniky

Otestovali jsme 17 bezdrátových sluchátek

Jak na nákup vánočních dárků ze zahraničí

4 tankové tiskárny v přímém souboji