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

V tomto díle se začneme zaobírat základy objektového programování a jeho aplikací v jazyku C#. Vysvětlíme si co je to třída , její instance a základní pojmy s tím související. Je důležité tyto pojmy a s tím spojené principy chápat, protože na nich je postaven vývoj aplikací pro platformu Microsoft.NET.

Proč objekty?

Objektově orientovaný přístup k vývoji softwaru je v dnešní době velmi využívaný. Na těchto principech staví své systémy a technologie všechny moderní společnosti IT světa. Důvody použití tohoto přístupu na rozdíl od přístupu strukturovaného, používaný například v jazycích Pascal nebo C, mimo jiné jsou:

  • přehlednější zdrojové kódy
  • vyšší znovupoužitelnost vytvořených aplikací
  • jednodušší správa aplikací

Objekty a třídy

Objekty ve světě vývoje aplikací často představují abstrakci objektů reálného světa . To s sebou přináší, větší možnosti při návrhu struktury jednotlivých částí aplikace. Každý objekt je instancí neboli výskytem třídy. Třídu lze chápat jako šablonu pro vytváření objektů. Pro lepší pochopení si jako třídu lze představit například auto a jako objekt – její instanci třeba Audi A4, Volvo S40 nebo Ford Mondeo. Všechny tyto objekty jsou konkrétní typy aut. To nám přináší důležitou informaci a tou je, že při vlastním programování nepíšeme přímo objekty, ale třídy a podle ní pak budou jednotlivé objekty vytvářeny.

Každá třída může obsahovat definici pro:

  • metody – operace, které může třída nebo pomocí ní vytvořený objekt provádět
  • atributy – představují stavy/data třídy nebo vytvořeného objektu

Zapouzdření objektů

Zapouzdření je jednou ze základních vlastností objektově orientovaného přístupu a existuje z důvodu, že data a operace objektu se vzájemně ovlivňují – tvoří nedělitelný celek. Zapouzdření znamená, že objekt má některé své členy (metody/atributy) před okolím skryty. Členy přístupné okolí se nazývají rozhraní objektu.

Se zapouzdřením souvisí i vlastnosti nazývané:

  • selektory – slouží k získání hodnoty nějakého skrytého atributu, ale neumožňují tuto hodnotu modifikovat
  • modifikátory – slouží ke změně hodnoty nějakého skrytého atributu

Implementace v C#

Na ukázku si v jazyku C# napíšeme jednoduchou třídu představující žárovku, která bude mít atributy identifikující její výkon a stav zda-li svítí.

Konstruktor

Každá třída musí mít konstruktor, který představuje předpis na vytvoření nového objektu. Konstruktor nejčastěji obsahuje kód pro inicializaci (první nastavení hodnoty) některých, nebo všech atributů nově vznikajícího objektu. Pokud ho ve své třídě neuvedeme, použije se implicitní (výchozí) konstruktor, který žádné takovéto „přípravné“ operace neprovádí. Zápis definice konstruktoru je následující:

public Nazev_Tridy()
{
        //kod operaci, ktere se provedou vzdy pri vytvareni noveho objektu podle teto tridy
}

Konstruktoru mohou být také předány parametry se kterými bude při vytváření nového objektu pracovat. Definice konstruktoru očekávajícího parametry se zapisuje takto:

public Nazev_Tridy(datový_typ Název_parametru, datový_typ Název_parametru2)
{
        //kod operaci, ktere se provedou vzdy pri vytvareni noveho objektu podle teto tridy a vyuzivaji predane
        //parametry
}

Atributy a vlastnosti

Atributy třídy se v C# definují zápisem:

Specifikátor_přístupu datový_typ Nazev_Atributu;

V našem ukázkovém příkladu má atribut výkon implementován selektor i modifikátor a atribut svítí pouze selektor. K deklaraci (vyjádření) selektorů a modifikátorů slouží v jazyku C# takzvané vlastnosti (properties). Vlastnosti tedy určují co se provede za akce při čtení atributu (blok get) a při jeho modifikaci (blok set). Jejich zápis je ve tvaru:

Specifikátor_přístupu datový_typ Nazev_Vlastnosti

        get 
        { 
                // v tomto bloku se může nalézat provádění operací pred vrácenim hodnoty 
                //například nějaký výpočet, tento blok musí obsahovat klíčove slovo return, //které určuje, že specifikátor vrátí výslednou hodnotu 
                return výsledná_hodnota
        } 
        set 
        { 
                //v tomto bloku se nacházejí operace potřebné k nastavení hodnoty skrytého //atributu, klíčové slovo value představuje přiřazovanou hodnotu 
                název_atributu = value
        }
}

Získání hodnoty se následně provádí zápisem:

nazev_promenne = Nazev_Objektu.Nazev_Vlastnosti;

Nastavení hodnoty pak:

Nazev_Objektu.Nazev_Vlastnosti = hodnota;

Metody

Výsledkem toho, že atribut svítí nebude mít uveden modifikátor, nebude moci být pomocí vlastnosti nastaven. Změna atributu svítí bude implementována v metodách (operacích) rozsvítit a zhasnout. Zápis metod vypadá takto:

Specifikátor_přístupu datový_typ Nazev_metody()

        //kód metody 
        return návratová_hodnota;
}

V případě, že je jako datový typ metody uveden void, metoda žádnou hodnotu nevrací a slovíčko return není poviné. Také je možné, aby byli metodě při volání předány nějaké parametry. Zápis metody by v tomto případě byl následovný:

Specifikátor_přístupu datový_typ Nazev_metody(datový_typ Nazev_parametru, datový_typ Nazev_parametru2)

        //kód metody 
        return návratová_hodnota;
}

Specifikátory přístupu

Pro určení viditelnosti členů vně třídy nebo vytvořeného objektu slouží specifikátory přístupu, které jsou v C# představovány klíčovými slovy:

  • private – specifikuje, že člen je privátní (soukromý) - přístupný pouze uvnitř třídy
  • public – specifikuje, že člen je veřejný – přístupný z jiných tříd
  • protected – specifikuje, že člen je přístupný pouze potomkům třídy

Specifikátor protected souvisí s problematikou dědičnosti, kterou si probereme v příštím díle. Ve výčtu je tento specifikátor přístupu uveden pouze pro úplnost seznamu základních specifikátorů.

Na obrázku níže je zobrazena třída Žárovka pomocí jazyku UML (Unified Modeling Language), což je jazyk užívaný pro vizuální vyjádření objektových konceptů.

Ukázková třída žárovka

Následující zdrojový kód implementuje třídu Žárovka a její členy.

namespace priklady_zive
{
 public class Zarovka
 {
  // deklarace soukromych atributu tridy
  private int vykon;
  private bool sviti;

  //deklarace vlastnosti Vykon pres kterou lze precist ci nastavit
  //atribut vykon
  public int Vykon
  {
   //definice selektoru
   get
   {
    return vykon;
   }
   //definice modifikatoru
   set
   {
    vykon = value;
   }
  }
  //deklarace vlastnosti Sviti pres kterou lze pouze precist atribut sviti
  public bool Sviti
  {
              //definice selektoru
   get
   {
    return sviti;
   }
  }

//konstruktor bez vstupnich parametru tridy zarovka - pri vytvoreni je zarovka //zhasnuta
  public Zarovka()
  {
           sviti = false;
  }
  //metoda, ktera nastavi atribut sviti na hodnotu true
  public void Rozsvitit()
  {
   sviti = true;
  }
          //metoda, ktera nastavi atribut sviti na hodnotu false
  public void Zhasnout()
  {
           sviti = false;
  }
 }

Tímto máme vytvořenou naši novou třídu a teď budeme potřebovat vytvořit instanci této třídy – konkrétní objekt. Vytvoření nové instance a uložení reference na ni do proměnné se provádí v C# následujícím způsobem:

Datový_typ Nazev_promenne = new Datový_typ();

Tento řádek zařídí zavolání bezparametrického konstruktoru třídy.

Zdrojový kód konzolové aplikace s vytvořením nové instance třídy žárovka a využitím členů vzniklého objektu by tedy mohl vypadat takto:

namespace priklady_zive
{
 class ZarovkaTest
 {
  public static void Main(string[] args)
  {
              //zavolani konstruktoru pro vytvoreni instance tridy zarovka
   Zarovka naseZarovka = new Zarovka();
   //nastaveni atributu vykon přes vlastnost Vykon
naseZarovka.Vykon = 120;
   Console.WriteLine("Vykon zarovky je " + naseZarovka.Vykon);
   Console.WriteLine("Atribut sviti zarovky = " + naseZarovka.Sviti);
   //zavolání metody Rozsvitit
naseZarovka.Rozsvitit();
Console.WriteLine("Atribut sviti zarovky po zavolani metody Rozsvitit = " + naseZarovka.Sviti);
//zavolání metody Zhasnout
   naseZarovka.Zhasnout();
Console.WriteLine("Atribut sviti zarovky po zavolani metody Zhasnout = " + naseZarovka.Sviti);
   Console.ReadLine();
  }
 }
}

Výstup aplikace by vypadat takto:

Vykon zarovky je 120
Atribut sviti zarovky = False
Atribut sviti zarovky po zavolani metody Rozsvítit = True
Atribut sviti zarovky po zavolani metody Zhasnout = False

Příště si rozebereme problematiku dědičnosti tříd v C#, blíže se podíváme se na metody a konstruktory s parametry a také se dozvíme co se skrývá pod pojmem přetížení.

Diskuze (23) Další článek: Phisheři očekávají během Vánoc bohaté žně

Témata článku: , , , , , , , , , , , , , ,