Programujeme v jazyku C# - Diel 31. - OOP IV.

Michal Čižmár  /  20. 07. 2005, 00:00

Existujú špeciálne typy metód, ktoré slúžia na nastavenie hodnôt členských premenných a na získanie ich obsahu. Tzv. set-y a get-y metódy. Ďalším špeciálnym typom metód sú konštruktory a deštruktory, ktoré sa volajú pri vzniku inštančnej premennej alebo pri jej zániku.

>>Vlastnosti (properties)
V C++ ste sa mohli stretnúť takmer vždy s množinou metód, ktorých meno začínalo na Set... alebo Get... . Bolo to dosť neprehľadné a nepraktické, pretože sa s nimi muselo robiť ako s metódami. V C# pomocou properties aj keď iná trieda nepriamo (ale jednotne) pristupuje k členským premenným je zachovaný princíp zapuzdrenia. C++Builder od firmy Borland to už vtedy vyriešil rozšírením C++ o properties, ale nebolo to podľa C++ štandardu.

Príklad 31.1

//---------------------------------------------------
using
System;
class
Cas
{
    uint hodina = 0;
    uint minuta = 0;

    public uint Hodina //vlastnost
   {
        get { return hodina; }
        set { hodina = value; }
   }
   public uint Minuty //vlastnost
  {
      get { return minuta; }
      set
     {
         minuta = value % 60;
         hodina += value / 60;
     }
  }
    public static void Main(string[] args)
  {
        Cas cas1 = new Cas();
        cas1.Minuty= 90;

       Console.WriteLine(" {0}:{1}", cas1.Hodina,
       cas1.Minuty);
   }
}//
_==_
//---------------------------------------------------

Príklad na stiahnutie: www.inet.sk/download/user/Priklad31.1_properties.zip

Vidíte, že vlastnosti sa deklarujú podobne ako metódy, až na to, že sa neuvádzajú vstupné parametre, teda ani okrúhle zátvorky (tie sa nepíšu ani pri volaní vlastností). Potom sa rozdeľuje na čas get a set ohraničenú zloženými zátvorkami. V príklade, ak vložíme do minút väčšie číslo ako 60, tak sa rozloží na hodiny a minúty.

V časti get, sa používa štandardne return. Samozrejme, že vo vnútri vlastnosti sa môžu volať iné metódy a podobne.
V časti set sa nastavujú členské premenné. Implicitne je tu vždy iba jedna vstupná premenná a je pomenovaná value. Je takého dátového typu ako celá vlastnosť.
Aká časť vlastnosti sa použije (či set alebo get) sa rozhodne podľa toho, na ktorej strane je táto vlastnosť použitá.
int i = cas1.Minuty ; // použije sa get
cas1.Minuty = 90; // použije sa set

>>Konštruktor

Je to špeciálna metóda, ktorá má to isté meno ako trieda a nemá žiadne výstupné parametre. Môže mať rôzny počet parametrov, môže sa preťažovať a ak žiadny konštruktor nenaprogramujeme, tak sa jeden prázdny vytvorí implicitne.

Je to inicializačná metóda a teda sa volá automaticky vždy pri vzniku inštančnej premennej. Slúži na nastavenie počiatočných hodnôt členských premenných, zaregistrovanie sa atď. Počiatočné hodnoty môžu byť nastavené už počas vytvárania programu priamo pri deklarácii členských premenných (na rozdiel od C++). Teraz sa konštruktor využíva hlavne ak počiatočné hodnoty sú známe až za behu programu.

>>Deštruktor

Táto metóda musí mať tiež rovnaké meno ako trieda, ale na začiatku mena je vlnovka ~
a tak isto nemá výstupnú premennú. Nemôžeme ho preťažovať, pretože nemôže mať žiadnu vstupnú premennú aj keď guľaté zátvorky sa píšu. Volá sa vždy pri rušení inštancie GarbageCollectorom(čo sa môže stať kedykoľvek, nedeterministicky) .

Deštruktor sa veľmi nevyužíva, pretože inštancie, ktoré nemajú deštruktor sa rušia hneď ako nie sú potrebné a je na to čas. Zatiaľ, čo inštancie s deštruktorm sa rušia až na konci programu (v opačnom poradí ako inšt. vznikali) alebo keď je málo pamäti, čo môže spomaľovať veľké programy. Niekedy je jeho použitie veľmi praktické, viď príklad :

Príklad 31.2

//---------------------------------------------------
using
System;
class
Cas
{
    public uint hodina;
    public uint minuta;

    // dva konstruktory

   Cas
() { hodina = 0; minuta = 0; }
   Cas(uint h, uint m) { hodina = h; minuta =m;}
  ~
Cas() //destruktor
  {
      Console.WriteLine(@" Instancia bola zrusena
                                   v {0}:{1}"
,hodina,minuta);
   }

   public static void Main(string[] args)
  {   
     Cas c1 = new Cas();
     c1 = new Cas(12,30);
  }
} //
_==_
//---------------------------------------------------

Príklad na stiahnutie: www.inet.sk/download/user/Priklad31.2_Konstruktor.zip

Keď program končí, automaticky sa spustia deštruktory a program vypíše nasledovné :
Instancia bola zrusena v 12:30
Instancia bola zrusena v 0:0

>>Statický konštruktor

Ak ste doteraz všetkému pochopili asi si viete predstaviť načo slúži statický konštruktor. Slúži na inicializáciu statických členských premenných. Je zaručené, že všetky statické konštruktory sa zavolajú ešte pred volaním Main(). Nie je, ale zaručené, že aj skončia, kým sa začne vykonávať Main(). Môže nastať prípad vzájomných závislostí tried a pri volaní static. konštruktorov môže dôjsť k deadLock (zamrznutiu programu).

Príklad 31.3

//---------------------------------------------------
using
System;
class
Cas
{
   public static uint hodina;
   public static uint minuta;

   static Cas() { hodina = 22; minuta = 22; }

   public static void Main(string[] args)
   {
      Console.WriteLine("{0}:{1}",Cas.hodina,
                                  Cas.minuta);
  }
} //
_==_
//---------------------------------------------------

Príklad na stiahnutie:
www.inet.sk/download/user/Priklad31.3_static_konstruktor.zip

>>Čo bude nabudúce?

Už posledný diel z prvej série seriálu o programovaní v jazyku C#. Doberieme OOP. Ukážeme si jednoduché príklady na dedičnosť a polymorfizmus a prezradím vám dva vynikajúce pravidla, ktoré sa používajú pri navrhovaní trie. .

>>Predchádzajúce diely
......
......
......

Michal Čižmár
_==_
micit@orangemial.sk




Neprehliadnite: