Začátečník

Pokročilý

Profesionál

Prostor pro experimentování

Programátorská laboratoř

 

Budete potřebovat přibližně 70 minut

Operační systém použitý v příspěvku: Windows 2000

Vývojové nástroje: Visual Studio .NET

 

 

 

Ukázka míchání programovacích jazyků platformy .NET (Visual Basic .NET a Visual C# .NET)

Implementace vlastnosti, která je jenom pro čtení

Zobrazení čísel řádků v editoru pro zápis kódu

 

 

Ukázka míchání programovacích jazyků platformy .NET

(Visual Basic .NET a Visual C# .NET)

 

Skalní příznivci naší programovací rubriky si jistě vzpomenou, že problematice míchaní programovacích jazyků jsme se již věnovali. Tehdy bylo naším společným cílem vytvoření dynamicky linkované knihovny (DLL) v jazyku Visual C++ a posléze její využití v prostředí Visual Basicu. V tomto tipu si na mušku vezmeme dalšího zástupce programovacích jazyků platformy .NET, kterým je zcela nový a plně objektově orientovaný Visual C# .NET.

 

C# představuje další evoluční článek ve vývoji programovacích jazyků, základem kterých byl populární, i když pro mnoho programátorů značně obtížný jazyk C a posléze také C++. Ti z vás, kteří někdy pracovali s Visual C++ a jeho IDE, jistě uznají, že největším problémem, zejména v začátcích, byla absence plně vizuálního prostředí pro návrh aplikací ve stylu Windows. Dobrou zprávou je, že při programování ve Visual C# .NET již nebudete odkázáni jenom na psaní programovacích smyček, ale můžete využít stejné IDE, na jaké jste zvyklí z VB .NET. Ve všeobecnosti by bylo možné prohlásit, že jazyk C# je velmi vhodným kandidátem na to, abyste se pokusili porozumět alespoň základům práce s ním. Nejenom, že vám nabízí všechno „dobré“ ze světa C a C++, ale přidává mnohé prvky a programové konstrukce, které jsou vám, jako profesionálním programátorům ve VB .NET, v mnoha ohledech známé.

 

V následující případové studii si ukážeme, jak lze spojit sílu Visual Basicu a C#. Naším hlavním zájmem bude vytvoření třídy v prostředí C#. Tato třída bude obsahovat jednu metodu, kterou později zavoláme z VB .NET. Pusťme se tedy do práce.

 

Tvorba projektu typu Class Library ve Visual C#

 

  1. Spusťte Visual C#, vyberte nabídku File, ukažte na New a klepněte na položku Project.
  2. V dialogovém okně New Project se ujistěte, že v sekci Project Types je vybrán adresář Visual C# Projects. V rámečku Templates zvolte položku s ikonou Class Library (obr. 1). Projekt s třídou jsem pojmenoval jako CS_Auto a rovněž tak jsem aktivoval i volbu Create directory for Solution.    

 

 

Obr. 1 – Výběr typu projektu Class Library ve Visual C# .NET

 

  1. Jestliže klepněte na tlačítko OK, C# vytvoří projekt s názvem CS_Auto, do kterého přidá třídu s názvem Class1.

 

Pokud se podíváte do okna Solution Explorer, uvidíte, že kód třídy Class1 je uložen v souboru s názvem Class1.cs. 

 

 

Bližší pohled na automaticky vygenerovaný kód projektu

 

Podívejme se v této chvíli na všechen automaticky sestavený kód a povězme si, co dělá:

 

using System;

 

namespace CS_Auto

{

      /// <summary>

      /// Summary description for Class1.

      /// </summary>

      public class Class1

      {

            public Class1()

            {

                  //

                  // TODO: Add constructor logic here

                  //

            }

      }

}

 

Při studiu programového kódu jazyka Visual C# uvidíte, že některé příkazy a klíčová slova jsou psána malými písmeny a jiné partie kódu kombinují malá i velká písmena. Je potřebné, abyste měli na paměti skutečnost, že jazyk C# striktně rozlišuje mezi malými a velkými písmeny abecedy (jazyk C# je tedy „case-sensitive“, podobně jako třeba C nebo C++). 

 

Na úvodním řádku je použit příkaz using, který je protějškem příkazu Imports z VB .NET. Zavádí do programového kódu třídy odkaz na jmenný prostor .NET Frameworku s názvem System. Podobně také příkaz Imports se ve VB .NET používá na to, aby bylo možné odkazovat se na další třídy, metody a vlastnosti daného jmenného prostoru bez nutnosti uvádění plně kvalifikovaných názvů. Ve C# se příkaz using musí nacházet ještě před definicí jakýchkoliv dalších jmenných prostorů.

 

Podobně jako v jazycích C a C++, tak i v C# je řádek programového kódu ukončen středníkem, tedy ne stiskem klávesy Enter, jak je tomu ve Visual Basicu .NET. 

 

Výpis kódu pokračuje definicí jmenného prostoru pomocí klíčového slova namespace.  Jak si můžete všimnout, jméno projektu (CS_Auto), které jste zadali při vytváření projektu, je současně názvem jmenného prostoru. Kód samotné třídy (zatím standardně pojmenované jako Class1) i konstruktoru se nachází ve vyhrazeném bloku, jenž je ohraničen klíčovým slovem namespace a příslušnými složenými závorkami, které definují hranice tohoto programového bloku.

 

Značka <Summary> patří mezi několik dokumentačních značek, které podporují implementaci XML dokumentace programového kódu jazyka C#.

 

Konečně se dostáváme k deklaraci samotné třídy Class1. Třída je deklarována s přídomkem public, co znamená, že jde o veřejnou třídu, která bude dostupná v celém projektu. Přesnější by bylo vyjádření, že instance této veřejné třídy, tedy samotné objekty, bude možné tvořit z jakéhokoliv místa v projektu. Standardní název třídy změňte na Automobil.      

 

V bloku třídy je deklarován také konstruktor, který má ve Visual C# stejný název jako samotná třída. Konstruktorem se rozumí metoda, která je primárně aktivována v okamžiku vytváření instance třídy. Konstruktor je velmi užitečný, protože prostřednictvím něho lze vhodně inicializovat datové členy třídy ještě předtím, než se tyto použijí. Jak v prostředí C#, tak i ve VB .NET lze vytvářet několik variant konstruktorů se stejným názvem a odlišnou signaturou. Uvedenému procesu se poté říká přetížení konstruktoru.

 

Protože třída a její konstruktor musí mít stejné názvy, upravte i název konstruktoru na Automobil. 

 

 

Přidání metody do vytvořené třídy

 

Do třídy Automobil přidáme pro zjednodušení jenom jednu veřejnou metodu s názvem VypočístSpotřebu, úkolem které bude zjištění výše spotřeby automobilu.  Ukažme si ovšem nejprve výpis modifikovaného programového kódu projektu a poté si vysvětlíme, jak ve skutečnosti pracuje:

 

using System;

 

namespace CS_Auto

{

      /// <summary>

      /// Summary description for Class1.

      /// </summary>

      public class Automobil

      {

            public Automobil()

            {

                  //

                  // TODO: Add constructor logic here

                  //

            }

 

            public int VypočístSpotřebu(int PočetKilometrů,

                  short SpotřebaNaKilometr)

            {

                  return PočetKilometrů*SpotřebaNaKilometr;

            }

      }

}

 

Kód metody VypočístSpotřebu se nachází pod kódem konstruktoru třídy. Metoda je definována jako veřejná a pracuje se dvěma parametry:

 

 

V těle metody je umístěn jenom jeden řádek kódu, který vypočte celkovou spotřebu automobilu a tuto vypočtenou hodnotu následně vrátí volající proceduře (volající proceduru vytvoříme za chvíli ve VB .NET).

 

Po napsání programového kódu je načase přeložit projekt. Vyberte nabídku Build a aktivujte příkaz Build Solution.  

 

Jestliže vše proběhlo úspěšně, můžete přistoupit k dalšímu kroku, kterým je přidání projektu VB .NET do stávajícího řešení a nadvázání komunikace s právě vytvořenou třídou.

 

 

Přidání projektu VB .NET do stávajícího řešení

 

Postupujte podle instrukcí:

 

  1. Otevřete nabídku File, ukažte na položku Add Project a vyberte příkaz New Project.
  2. V sekci Project Types vyberte složku s názvem Visual Basic Projects. V rámečku Templates vyberte ikonu standardní aplikace pro Windows (Windows Application). Přidávaný projekt také vhodně pojmenujte. 

 

 

Obr. 2 – Přidání projektu Visual Basicu do řešení

 

  1. Obrazová struktura okna Solution Explorer by měla vypadat jako ta na obr. 3.

 

 

Obr. 3 – Podoba okna Solution Explorer po přidání projektu VB .NET

 

  1. V okně Solution Explorer klepněte pravým tlačítkem myši na položku References projektu VB .NET a zvolte příkaz Add Reference.

 

  1. V zobrazeném dialogovém okně se ujistěte, že je vybrána záložka .NET. Klepněte na tlačítko Browse a vyhledejte soubor DLL s kódem třídy, kterou jste vytvořili předtím v C#. Po vyhledání souboru a přidání odkazu na něj by mělo okno vypadat jako to na obr. 4.

 

 

Obr. 4 – Přidání reference na knihovnu DLL s kódem třídy Automobil

 

  1. Nakonec klikněte na tlačítko OK. V tomto okamžiku se přidá odkaz na knihovnu DLL do projektu Visual Basicu. Tuto situaci můžete pozorovat v okně Solution Explorer (obr. 5).

 

 

Obr. 5 – Jmenný prostor CS_Auto v projektu VB .NET

 

  1. V okně Solution Explorer ještě na chvíli zůstaneme. Aby bylo za chvíli možné spustit projekt VB .NET a otestovat chování třídy, musíte Visual Basicu povědět, aby jako startovací projekt nastavil právě projekt typu Windows Application. To uděláte tak, že na název projektu VB .NET klepněte pravým tlačítkem myši a z kontextuální nabídky vyberete příkaz Set as StartUp Project.

 

  1. Pokračujte tím, že na formulář přidáte jednu instanci ovládacího prvku Button. Na vytvořenou instanci poklepejte, na což se vám zpřístupní okno editoru pro zápis programového kódu. Do těla událostní procedury Button1_Click zadejte tento fragment zdrojového kódu:

 

     Dim ObjektAuto As New CS_Auto.Automobil()

 

     MessageBox.Show("Peněžní vyjádření spotřeby PHM vašeho auta činí " & _

     ObjektAuto.VypočístSpotřebu(100, 27)).ToString & " Kč.", _

     "Ukázka míchání programovacích jazyků")

 

  1. Spusťte řešení (klávesa F5) a klepněte na tlačítko Button1. Výslední efekt činnosti kódu můžete vidět na obr. 6.

 

 

Obr. 6 – Míchání programovacích jazyků v praxi

 

Zpět na obsah

 

Implementace vlastnosti, která je jenom pro čtení

 

Při objektově orientovaném návrhu je někdy zapotřebí vytvořit vlastnost objektu, která bude pro vnější svět jenom pro čtení. Jestliže je vlastnost určena pouze pro čtení, programový kód klientské aplikace může pouze číst hodnotu dané vlastnosti, není ovšem schopen hodnotu vlastnosti jakkoliv měnit. Jak vytvořit vlastnost jenom pro čtení, si ukážeme v tomto tipu.

 

Postupujte takto:

 

  1. Vytvořte novou aplikaci pro Windows (Windows Application).
  2. Přidejte do aplikace soubor pro třídu. Soubor s třídou zařadíte do aplikace tak, že vyberete nabídku Project a aktivujete položku Add Class. 

 

Předpokládejme, že budete chtít vytvořit třídu s názvem Počítač, která bude obsahovat vlastnost TaktCPU. Tato vlastnost bude určena jenom pro čtení. Programový kód, jenž předvádí tuto modelovou situaci je uveden níže:

 

Public Class Počítač

    Private ReadOnly m_TaktCPU As Integer

    Public ReadOnly Property TaktCPU() As Integer

        Get

            Return m_TaktCPU

        End Get

    End Property

 

    Public Sub New()

        m_TaktCPU = 1700

    End Sub

End Class

 

Každá vlastnost, která je určena jenom pro čtení, musí mít ve své deklaraci uvedeno klíčové slovo ReadOnly. Přesně stejná je situace i u vlastnosti TaktCPU. V těle vlastnosti TaktCPU je vytvořen jenom blok Get-End Get, který vrací hodnotu soukromého datového členu m_TaktCPU. Právě tento soukromý datový člen uchovává inicializační hodnotu, která reprezentuje takt procesoru v MHz a podobně jako samotná vlastnost i on musí mít v deklaračním příkazu uvedeno klíčové slovo ReadOnly.

 

Dobrá, doposud jsme si řekli, že vlastnost TaktCPU je určena jenom pro čtení a z tohoto důvodů nemá klientský kód oprávnění k modifikaci této vlastnosti. Jak ale potom nastavíme počáteční hodnotu této vlastnosti? Předem by bylo třeba říci, že samotná vlastnost neobsahuje hodnotu. Vlastnost je jenom programovací konstrukce, která umožňuje přistupovat k jisté hodnotě. Tato hodnota je ovšem uložena v soukromém datovém členu, resp. v proměnné datového typu Integer s názvem m_TaktCPU.

 

Vhodným okamžikem pro počáteční inicializaci datového členu m_TaktCPU je konstruktor třídy Počítač. Konstruktor ve VB .NET má vždy podobu veřejné procedury Sub New, která je standardně bez jakýchkoliv parametrů (pochopitelně, je možné vytvořit také konstruktor s parametry). V kódu konstruktoru dochází k inicializaci datového členu m_TaktCPU na hodnotu 1700. Vždy, když dojde k zrození instance této třídy, bude spuštěn kód konstruktoru, který inicializuje hodnotu soukromého datového členu. Po vytvoření instance třídy bude možné k hodnotě soukromého datového členu přistupovat pomocí vlastnosti TaktCPU.   

 

Předveďme si praktickou ukázku:

 

  1. Přidejte na formulář instanci ovládacího prvku Button a programový kód jeho událostní procedury Click doplňte tímto způsobem:

 

 

    Private Sub Button1_Click(ByVal sender As System.Object, _

    ByVal e As System.EventArgs) Handles Button1.Click

 

        Dim MojePC As Počítač

        MojePC = New Počítač()

        Me.Text = "Takt procesoru je " & _

        MojePC.TaktCPU & " MHz."

 

    End Sub

 

  1. Po spuštění aplikace se hodnota vlastnosti TaktCPU objektu MojePC objeví v titulkovém pruhu okna (obr. 7).

 

 

Obr. 7 – Zjištění hodnoty vlastnosti, která je určena jenom pro čtení

 

Zpět na obsah

 

Zobrazení čísel řádků v editoru pro zápis kódu

 

Z vlastní zkušenosti vím, že některým programátorům se s zdrojovým kódem pracuje lépe v případě, kdy jsou všechny řádky kódu číselně označené. Visual Basic .NET samozřejmě podporuje možnost zobrazování čísel řádků programového kódu. Volba, která tuto schopnost IDE aktivuje je ovšem poněkud dobře ukryta. Jak se k ní dopracovat, si ukážeme právě teď:

 

  1. Vyberte menu Tools a klepněte na poslední položku Options.
  2. V stromové struktuře složek v levé části okna Options klepněte na složku s názvem Text Editor.
  3. Dále klepněte na podsložku Basic a ujistěte se, že je vybrána položka General.
  4. V sekci Display zatrhněte volbu Line numbers (obr. 8) a aktivujte tlačítko OK.

 

 

Obr. 8 – Aktivace zobrazování čísel řádků v editoru pro zápis zdrojového kódu

 

Od této chvíle budou čísla řádků vaším nerozlučným pomocníkem při psaní programového kódu (obr. 9).

 

 

Obr. 9 – Čísla řádků v editoru pro zápis zdrojového kódu

 

Zpět na obsah

 

Ján Hanák