× Aktuálně z oboru

Programátoři po celém světě dnes slaví Den programátorů [ clanek/2018091300-programatori-po-celem-svete-dnes-slavi-den-programatoru/ ]
Celá zprávička [ clanek/2018091300-programatori-po-celem-svete-dnes-slavi-den-programatoru/ ]

VB - 46. lekce

[ http://programujte.com/profil/27-jiri-chytil/ ]Google [ ?rel=author ]       [ http://programujte.com/profil/118-zdenek-lehocky/ ]Google [ ?rel=author ]       30. 8. 2006       20 770×

46.1 Objekty a objektově orientované programování v jazyce VB
46.2 Třídy, co to je, k čemu jsou, jak se vytváří
46.3 Vytvoření instance třídy, tedy objektu
46.4 Domácí úkol
46.5 V další lekci

46.1 Objekty a objektově orientované programování v jazyce VB

Myslím, že jako první by bylo záhodno zavést nějakou terminologii. A začal bych asi tím, co je to vlastně OOP.

Objektově orientované programování spočívá v tom, že při programování pracujeme s objekty. Za objekt můžeme považovat třeba i formulář, tlačítko, textbox, nebo třeba objekt screen. Objekt má nějaké svoje vlastnosti a metody, ty tvoří interface (rozhraní) objektu. Pomocí metod a vlastností s objektem komunikujeme. Objekt má také nějaká svoje data, ke kterým vlastně nemáme přímý přístup a můžeme je měnit například pomocí různých metod, které nám objekt nabízí. O objektu tedy říkáme, že je zapouzdřen. Zapouzdření je věc velmi užitečná a zabrání změně dat, které by mohly objekt „poškodit“. Hned to vysvětlím: K datům v objektu nepřistupujeme přímo, to, že bychom nějakým příkazem jen tak přepsali, jak se to dělá u běžných proměnných, například:

lngDolniMezPole = 5

To nehrozí. My bude postupovat tímto způsobem:

NázevObjeku.ZpišDataTamATam (proměnnáKteráObsahujeOnyData)

O zapsání dat se tedy postará nějaká metoda. Ale u někoho může vyvstat otázka: Proč je to bezpečnější? No je to z toho důvodu že když proceduru oné metody vhodně upravíme, můžeme kontrolovat, zda stav objektu umožňuje zapsání proměnné. Bez příkladu se to špatně vysvětluje, tak si vezměme například objekt, který bude sloužit k ukládání dat a zároveň umožní data uvnitř sebe uzamknout. Například takto:

Call Trezor.Uloz (něco)
Call Trezor.Zamkni (heslo)
Data =  Trezor.Cti 'V proměné bude navráceno například oznámení o tom, že je trezor uzavřen.
Call Trezor.Uloz (něco) 'Data se opět neuloží a to proto, že je trezor uzamčen. Pokud bychom výsledek funkce vložili do proměnné, mohlo by tam být opět hlášení o uzavřeném trezoru.
Call Trezor.Odemkni (heslo) 'Teď již z trezoru můžeme číst i do něj data ukládat.

Tím bychom za sebou tedy měli jednu z výhod objektů, a to právě zapouzdření. Objekty mají spoustu výhod, ale dostaneme se k nim pěkně postupně.

46.2 Třídy; co to je, k čemu jsou, jak se vytváří

O objektu říkáme, že je instancí třídy. A co to znamená pro nás běžné smrtelníky? No je to poměrně jednoduché. Třída je vlastně vzor, podle nějž se objekt vytvoří. Třída je tedy to, co budeme vytvářet my. A jak taková třída vypadá a jak sní následovně budeme pracovat? Budeme potřebovat modul třídy, do kterého budeme psát kód. Chová se jako běžný modul a vytvoříme ho v nabídce Projekt → Add ClassModule. V modulu třídy potom dělíme kód na několik částí, a to Public a Private; část Private obsahuje procedury, ke kterým nemáme přístup přes rozhraní objektu, tedy se k nim vůbec nedostaneme, a modul je ale využívá jako své interní funkce či procedury, většinou bývají v části Private všechny proměnné. Část Public tvoří právě rozhraní (interface) modulu. Obsahuje především funkce a procedury. Ty slouží k ovládání objektu. Nyní malá ukázka třídy trezor. Zatím jen základní vlastnosti. Časem se podíváme na to, jak třídu udělat profesionálnější. A takovou, aby se nám s ní pracovalo co nejlépe.

Dim slot1 As String
Dim slot2 As String
Dim slot3 As String
Dim slot4 As String
Dim slot5 As String
Dim zavreno As Boolean
Dim oHeslo As String

Public Function Zapis(data As String, slot As Byte) As String
    If zavreno = False Then
        Select Case slot
        Case 1
            slot1 = data
        Case 2
            slot2 = data
        Case 3
            slot3 = data
        Case 4
            slot4 = data
        Case 5
            slot5 = data
        End Select
        Zapis = "data byla zapsána do slotu" & slot
    Else
        Zapis = "trezor je zavřený, data nelze zapsat"
    End If
End Function

Public Function Cteni(slot As Byte) As String
    If zavreno = False Then
        Select Case slot
        Case 1
            Cteni = slot1
        Case 2
            Cteni = slot2
        Case 3
            Cteni = slot3
        Case 4
            Cteni = slot4
        Case 5
            Cteni = slot5
        End Select
    Else
        Cteni = "trezor je zavřený, nelze číst data"
    End If
End Function

Public Function ZavriOtevri(heslo As String) As String
    If zavreno = False Then
        oHeslo = heslo
        zavreno = True
        ZavriOtevri = "Otevři"
    Else
        If heslo = oHeslo Then
            zavreno = False
            ZavriOtevri = "Zavři"
        Else
            ZavriOtevri = "špatné heslo"
        End If
    End If
End Function

To je tedy onen krátký slibovaný kód. Ale není příliš dokonalý a není problém zapsat špatné hodnoty. Proto je nutné tento kód ošetřit optimálně funkcí Private, která se bude kontrolovat vstupní hodnoty, zda nejsou chybné. Proč jsem to neudělal a předkládám vám takový nedokonalý kód? Pokud to chcete vědět, zkuste se podívat dolů pod nadpis Domácí úkol.

46.3 Vytvoření instance třídy, tedy objektu

Takže máme vytvořenou nějakou tu třídu. Ale co si teď s onou třídou počít nebo jak ji využít? Použijeme ji, když to řeknu hodně zjednodušeně, jako formičku, podle které se vytvoří objekt. A s objektem již můžeme pracovat. Objekt vytvoříme takto:

Dim objkt As Object

Private Sub Form_Load()
Set objkt = New trezor
End Sub

Příkaz Set vytvoří z třídy trezor objekt „objkt“, ten má nyní vlastnosti třídy; je to stejné jako když na formulář vložíte tlačítko, rozdíl je v tom, že pracujeme (zatím) jen v kódu. Objektů můžeme vytvořit kolik je libo či tolik, na kolik nám bude stačit paměť. S objektem potom pracujeme skrze funkce a procedury, které tvoří interface objektu. Komunkace může vypadat třeba takto:

Private Sub Command1_Click()
a = objkt.Zapis(Text1.Text, Val(Text2.Text))
MsgBox a
End Sub

Private Sub Command2_Click()
Command2.Caption = objkt.ZavriOtevri(Text3.Text)
End Sub

Private Sub Command3_Click()
Text1.Text = objkt.Cteni(Val(Text2.Text))
End Sub

To, co zde momentálně uvádím, není ani zdaleka optimální. Stejně jako není ani třída objektu trezor, který jsem uvedl. A tak bude i tato část kódu patřit k domácímu úkolu.

46.4 Domácí úkol

Zadání domácího úkolu je veskrz prosté; spočívá ve zrobustnění kódu tak, aby byl odolný vůči chybným zadáním. A také se podívat na to, jak to celé funguje. Prostě to pochopit.

46.5 V další lekci

V další lekci budeme pokračovat v třídách a objektech. Proto ti, kteří z toho zatím nejste moudří, nezoufejte, v příští lekci se již nebudeme věnovat tolik teorii, ale kousek po kousku si vytvoříme dva objekty, a to zásobník a frontu se vším všudy.


Článek stažen z webu Programujte.com [ http://programujte.com/clanek/2006082009-vb-46-lekce/ ].