|
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)
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#
Obr. 1 – Výběr typu projektu Class Library ve
Visual C# .NET
|
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í:
Obr. 2 – Přidání projektu
Visual Basicu do řešení
Obr. 3 – Podoba okna Solution Explorer po přidání projektu
VB .NET
Obr. 4 – Přidání reference na
knihovnu DLL s kódem třídy Automobil
Obr. 5 – Jmenný prostor CS_Auto v projektu VB .NET
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ů")
Obr. 6 – Míchání
programovacích jazyků v praxi
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:
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:
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
Obr. 7 – Zjištění hodnoty
vlastnosti, která je určena jenom pro čtení
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ď:
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
Ján Hanák