Logo Kurzy výpočtovej techniky

E-mail:

Telefón:

kurzy@ipex.sk

02 5810 1410

Namespace a Class

Namespace

Namespace je formalizmus (konvencia) a podporné mechanizmy vo VS .NET určené na to, aby sme si vedeli nejako roztriediť a udržali poriadok v software na celom svete. Silné slová ? Áno, ale trochu to funguje.

Je to hierarchický systém názvov s bodkami, v ktorom naša knižnica KurzLib by mohla byť presnejšie špecifikovaná takto (ale nebudeme to meniť):

  • Ipex.Kurzy.Cs.Pandora.Kurz.Lib

A v tomto namespace potom môžu byť definované jednotlivé triedy s unikátnymi názvami - napr. LibMess:

namespace Ipex.Kurzy.Cs.Pandora.Kurz.Lib

{

    public static class LibMess

    {

    ...

    }

}

Keď takúto triedu a jej metódu chceme niekde použiť, do projektu zaradíme referenciu na príslušnú dll a v záhlaví zdrojáku napíšeme:

  • using Ipex.Kurzy.Cs.Pandora.Lib;

a ďalej v kóde použijeme volanie:

  • LibMess.Ok("Kuk");

Alebo bez príkazu using napíšeme rovno

  • Ipex.Kurzy.Cs.Pandora.Lib.LibMess.Ok("Kuk");

Microsoft všetky súčiastky .NET technológie vytvára v namespace System a ostatné svoje produkty v namespace Microsoft. A do tohto sveta im snáď nikto nevstupuje (leda tak zlomyseľní záškodníci).

A ostatní dodávatelia SW ? Na strešnej úrovni by si mali vymyslieť nejaký unikátny názov a za bodkou nech si svoj svet členia už podľa svojho. Ibaže ako vytvoriť ten prvý unikátny názov ? Bude Ipex jediný na svete ? A čo sa stane, ak nebude ?

Nuž nebude jediný a nie je to ani žiadna dráma. Ak by sme vám raz dodali knižnice IpexLib.dll, IpexWinControls.dll a pod., ktoré obsahujú namespace Ipex.Lib, Ipex.WinControls a pod., jednoducho ich použijete vo svojich projektoch a vôbec vám nebude vadiť, že na Ukrajine niekto vytvára obdobné knižnice pre rovnaký namespace (možno nám ukradli zdrojáky :-).

Mierny problém nastane až vtedy, keď budete chcieť použiť naše a aj tie ukrajinské knižnice súčasne, lebo oni tam niečo vylepšili. Ako to urobiť ? Neviem isto, ale cesta by mohla vies tadeto:

  1. Ukrajinskú knižnicu (assembly) premenujete na IpexLibUA.dll a tak ju zaradíte do referencií v projekte.
  2. Vo vlastnostiach tejto referencie v projekte zmeníte Aliases napr. na IpexLibUA.
  3. V príkazoch using zavediete miestny alias pre ukrajinský namespace - using IpexLibUA = IpexLibUA::Ipex.Lib;
  4. Triedy z ukrajinského namespace potom môžete použiť explicitným zápisom IpexLibUA.Trieda.Metóda();

Toto je len momentálna extrapolácia mojich predstáv - nikdy som to neskúšal a teraz to ani nestihnem. Bolo by fajn, keby to skúsil niekto z vás:

  1. Treba zduplikovať celé solution KurzLib do nového adresára, tam ho otvoriť na vývoj a v metóde LibMess.Ok() urobiť viditeľne inú funkcionalitu - napr. k zobrazenému textu vždy dopísať " - Ukrajina".
  2. Potom aplikujte vyššie uvedený postup v projekte KurzWin a na nejakom tlačidle zavolajte ukrajinskú verziu triedy a metódy LibMess.Ok()
  3. Dajte nám vedieť výsledok.

Ale nemusíme ísť až takto ďaleko, aby sme narazili na menšie problémy s mennými priestormi (to je 6. pád od slova namespace :-):

  1. Je bežné, že v rôznych menných priestoroch sa nájdu rovnako nazvané triedy alebo iné prvky. Preto keď bude hľadať help  napr. k triede ComboBox, dajte si dobrý pozor, či čítate text k triede System.Windows.Forms.ComboBox, alebo System.Web.Forms.ComboBox - je to dosť rozdiel :-)
  2. Z viacerých menných priestorov, ktoré ste vtiahli do hry príkazmi "using", niekedy "trčia" rovnako nazvané prvky a nedá sa tomu vyhnúť. Napr. na nejakom formulári chcete pracovať s MS Wordom a máte tam príkazy:
    • using System.Windows.Forms;
    • using Microsoft.Office.Interop.Word;
    • ...
    • var oWord = new Application();
  3. A tu nastane problém, lebo trieda Application sa nachádza v oboch uvedených menných priestoroch (samozrejme každá z nich je iná) a kompilátor sa nevie rozhodnúť. Riešenie spočíva v tom, že do príkazu "new" explicitne vpíšete ten správny namespace:
    • var oWord = new Microsoft.Office.Interop.Word.Application();
  4. Alebo, aby to nebolo také dlhé v celom kóde, na začiatku dáte Wordu lokálny alias a ten potom použijete:
    • using Word = Microsoft.Office.Interop.Word;
    •  var oWord = new Word.Application();

Keďže na tomto kurze veľká kolízia menných priestorov nehrozí, namiesto dlhého názvu „Ipex.Kurzy.Cs.Pandora.Kurz.Lib“ sme použili kratšiu verziu „Kurz.Lib“. Presnejšie povedané, spoločnú strechu pre všetky naše projekty tvorí namespace „Kurz“ a jednotlivé projekty používajú jeho podpriestory so samostatnými názvami za bodkou. A tak je to dobre.

Ešte pár slov ku vzťahu namespace / assembly (projekt):

  • v jednom assembly môžete budovať (prispievať do) viac menných priestorov
  • jeden namespace môžete budovať (vyskladať) vo viacerých assembly

Ten prvý prípad máme nechtiac aj v našich projektoch - napr. v projekte KurzWin by ste našli aj namespace Kurz.Win.Properties. V ňom raz budú ležať nástroje na čítanie (aj zápis) konfiguračného súboru aplikácie vo formáte XML.

Ten druhý prípad sa zíde, keď budeme chcieť rozlomiť nejaký príliš veľký projekt na dva alebo viac menších. A tie dokopy budú tvoriť jednu aplikáciu.

Class

Class, alebo po našom trieda, je hlavný (a takmer jediný) stavebný prvok nášho programovania v .NET. Triedy na sebe nesú obidve fundamentálne zložky software - dáta a kód.

Trochu sa im podobajú tzv. štruktúry (struct), ale tie majú neporovnateľne menší rozsah použitia ako triedy, a tak ich tu nebudeme brať do úvahy (preberú sa neskôr).

Dáta a ani kód nemôžu existovať mimo tried, takže aj hlavný program v našom projekte KurzWin sa nachádza v nejakej triede - menovite App.

Triedy sa obvykle deklarujú ako „public“ na úrovni namespace (tu musí byť všetko public), ale môžu sa deklarovať aj vo vnútri iných tried (tu môžu byť aj private).

Odlišujú sa triedy „static“, ktoré v aplikácii existujú len v jednej inštancii a netreba ich programovo zriaďovať. Na prvky v nich sa odvolávame priamo prostredníctvom názvu triedy.

Mnohonásobne častejšie sa používajú triedy inštančné (bez slovíčka static), ktoré treba najprv inštanciovať a až potom sa dajú použiť. Presnejšie povedané - z triedy sa najprv musia vyrobiť objekty a až s tými sa dá pracovať:

            var oForm = new frmHop();

            oForm.Show();

Vo vnútri tried sa dá umiestniť všeličo, ale najčastejšie to býva:

  • dátové položky (fields) - premenné „zavesené“ na triede
  • vlastnosti - programovo definované prístupové mechanizmy k dátam v triede (get a set)
  • metódy - programový kód
  • enumerácie, udalosti, delegáti a iné

O triedach a veciach v nich bude celý tento kurz, tak sa snáď nič nestane, keď tento úvod trochu skrátim.

Cvičenie - statické a inštančné triedy

V projekte KurzWin ste si mohli všimnúť, že formulár frmHop sa dá „vyniesť“ von z podkladového formulára aplikácie - a to sme asi nechceli.

Na zobrazenie formulára len nad podkladovou plochou aplikácie treba napísať trochu viac písmeniek, a aby sme to nemuseli robiť často, urobme si jednu triedu na správu formulárov. Tá bude užitočná aj v iných aplikáciách, tak ju dáme do knižničného projektu KurzLib a jej inštanciu „zavesme“ na základnú triedu App v našom projekte KurzWin.

Obidva projekty môžete mať otvorené súbežne v dvoch samostatných oknách VS:

  1. Do projektu KurzLib doplňte New Item (pravá myš) - Class - s názvom AppForms a kód upravte takto:

    using System;

    using System.Collections.Generic;

    using System.Linq;

    using System.Text;

     

    using System.Windows.Forms;

     

     

    namespace Kurz.Lib

    {

        public class AppForms

        {

            public Form MainForm;

     

     

            public void Show(Form oForm, bool bModal = false)

            {

                if (bModal)

                    oForm.ShowDialog();

                else

                {

                    oForm.MdiParent = this.MainForm;

                    oForm.Show();

                }

            }

        }

    }

  2. Vysvetlenie:
    • hore je doplnený príkaz using System.Windows.Forms;
    • pred slovíčko „class“ je vložený explicitný modifikátor viditeľnosti „public“ - lepšie to tak vyzerá :-)
    •  do triedy je vložená metóda Show(), ktorá zobrazí dodaný formulár normálne alebo modálne
  3. Projekt KurzLib zbildujte tlačidlom F6 a prepnite sa do projektu KurzWin.
  4. Otvorte formulár frmMain na design a nastavte mu vlastnosť IsMdiContainer na true.
  5. Otvorte zdroják App.cs, za príkazy using doplňte riadok:

    using Kurz.Lib;

    a počnúc metódou Main kód upravte takto:

            static void Main()

            {

                Application.EnableVisualStyles();

                Application.SetCompatibleTextRenderingDefault(false);

     

                MainForm = new frmMain();

                Forms    = new AppForms();

     

                Forms.MainForm = MainForm;

     

                Application.Run(MainForm);

            }

     

            public static frmMain  MainForm;

     

            public static AppForms Forms;

        }

    }

  6. V kóde hlavného fomulára frmMain upravte obsah metódy:

            private void mnuPrvotnePokusy_Hop_Click(object sender, EventArgs e)

            {

                App.Forms.Show(new frmHop());

            }

  7. Naštartujte program tlačidlom F5, vyvolajte formulár frmHop a vyskúšajte s ním hýbať.

Tým sme si vytvorili jednoduchý nástroj na štartovanie formulárov v základnom okne aplikácie, ktoré sme si prispôsobili na prácu v režime MDI.

Copyright © 1997-2018  Ipex IT, s.r.o. Stránka aktualizovaná:  17.02.2011, 10:52