Referenční typy - třída
4. Statická třída
Další vlastností jazyka C # je možnost deklarovat třídu jako statickou. Statická třída může obsahovat pouze statické složky (všechny objekty, které vytvoříte pomocí této třídy, sdílejí jednu kopii těchto složek). Účelem statické třídy je pouze držet užitkové metody a datové složky. Statická třída nemůže obsahovat žádná data nebo metody instance a nemá smysl pokusit se vytvářet instance statické třídy pomocí operátoru new (pokud to zkusíme, kompilátor ohlásí chybu). Pokud potřebujeme provést jakoukoli inicializaci, statická třída může mít výchozí konstruktor. Ten ale musí být deklarován jako statický. Jakékoli jiné typy konstruktoru kompilátor ohlásí jako nepovolené. [6]
Pokud budeme volat statickou datovou složku, nebo statickou metodu, musíme vždy uvádět jméno statické třídy, které tyto složky náleží (vzpomeňte si, že když jsme deklarovali nějakou metodu a volali jsme ji v hlavní statické metodě Main, musela být tato metoda také statická). Pokud nechceme pokaždé vypisovat název statické třídy, můžeme do jmenného prostoru uvést klíčové slovo using a static a definovat jmenný prostor, ve kterém se statická třída nachází. Pomocí tečkové notace vybereme statickou třídu, na níž se chceme odkazovat.
Pokud je používáno příliš statických tříd definovaných ve jmenném prostoru pomocí using, usnadní nám to psaní kódu, ale na druhou stranu je těžké spravovat takový kód. Není totiž jisté, která metoda do které třídy patří, a to může být problémem při jejich správě.
Ilustrativní příklad StatickaMetodaJinaTrida
Program StatickaMetodaJinaTrida
- Popis: Deklarace dvou statických tříd, použití jmenného prostoru se statickou třídou
- Zadání: Deklarujte nestatickou třídu Trida, která bude obsahovat hlavní metodu Main ve které budete volat statickou metodu StatickaMetoda z jiné statické třídy StatickaTrida. StatickaMetoda bude pouze obsahovat výpis textu "Nyní probíhá statická metoda v jiné statické třídě". Obě třídy jsou deklarovány ve společném jmenném prostoru StatickaMetodaJinaTrida
- Řešení: Bude postupně probráno v následujícím textu
V následujícím kódu vidíme, volání
statické metody jiné statické třídy z hlavní statické metody Main určité třídy – viz Kód 1. Pokud
bychom neuvedli odkaz na statickou třídu ve jmenném prostoru, museli bychom u
prvního příkazu statické metody Main
museli před statickou metodu StatickaMetoda uvést
název statické třídy, tj. StatickaTrida.Metoda()
ve které je metoda umístěna. Tím, že jsme ve jmenném prostoru definovali using static StatickaMetodaJinaTrida.StatickaTrida;
nemusíme u volání metodu StatickaMetoda vypisovat třídu, které patří.
using System; //Použití jmenného prostoru, kde je deklarována statická třída using static StatickaMetodaJinaTrida.StatickaTrida; namespace StatickaMetodaJinaTrida { class Trida { static void Main(string[] args) { //Volání statické metody jiné statické třídy StatickaMetoda(); //Čekání na stisk klávesy -> ukončení programu Console.ReadKey(); } } //Deklarace statické třídy static class StatickaTrida { //Deklarace veřejné statické metody jiné třídy public static void StatickaMetoda() { //Výpis Console.WriteLine("Nyní probíhá statická metoda v jiné statické třídě"); } } }
Kód 1: Příklad volání statické metody statické třídy v jiné nestatické třídě – uvedení použití statické třídy ve jmenném prostoru
Na výpisu v konzole vidíme, že v rámci
metody Main proběhlo volání statické
metody jiné statické třídy – viz Výstup programu - Kód 1.
Nyní probíhá statická metoda v jiné statické třídě
Výstup programu - Kód 1: Ukázka výsledku volání statické metody statické třídy v jiné
nestatické třídě