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.