10. diel - Vlastnosti vo Visual Basic .NET
V predchádzajúcom cvičení, Riešené úlohy k 9. lekcii OOP v VB .NET, sme si precvičili získané skúsenosti z predchádzajúcich lekcií.
V minulej lekcii, Riešené úlohy k 9. lekcii OOP v VB .NET , sme si vysvetlili statiku. V dnešnom VB.NET tutoriálu sa pozrieme na ďalšie prvky tried, ktoré ešte nepoznáme. Začnime prisľúbeným vlastnosťami.
Vlastnosti
Veľmi často sa nám stáva, že chceme mať kontrolu nad zmenami nejakého atribútu objektu zvonku. Budeme chcieť atribút nastaviť ako read-only alebo reagovať na jeho zmeny. Založme si nový projekt (názov Vlastnosti) a vytvorme nasledujúce triedu Študent, ktorá bude reprezentovať študenta v nejakom informačnom systéme.
Class Student Public jmeno As String Public muz As Boolean Public vek As Integer Public plnolety As Boolean Public Sub New(jmeno As String, pohlavi As Boolean, vek As Integer) Me.jmeno = jmeno Me.muz = pohlavi Me.vek = vek plnolety = True If vek < 18 Then plnolety = False End If End Sub Public Overrides Function ToString() As String Dim jsemPlnolety As String = "jsem" If Not plnolety Then jsemPlnolety = "nejsem" End If Dim pohlavi As String = "muž" If Not muz Then pohlavi = "žena" End If Return String.Format("Jsem {0}, {1}. Je mi {2} let a {3} plnoletý.", jmeno, pohlavi, vek, jsemPlnolety) End Function End Class
Trieda je veľmi jednoduchá, študent sa nejako volá, je nejakého pohlavia a má určitý vek. Podľa tohto veku sa nastavuje atribút plnoletý pre pohodlnejšie vyhodnocovanie plnoletosti na rôznych miestach systému. Na uloženie pohlavia používame hodnotu Boolean, či je študent muž. Konštruktor podľa veku určí, či je študent plnoletý. Metóda toString () je navrhnutá pre potreby tutoriálu tak, aby nám vypísala všetky informácie. V reáli by tam bolo pravdepodobne len meno študenta. Pomocou konstruktoru si nejakého študenta vytvorme:
{VBNET_CONSOLE} Dim s As New Student("Pavel Hora", True, 20) Console.WriteLine(s) {/VBNET_CONSOLE}
Class Student Public jmeno As String Public muz As Boolean Public vek As Integer Public plnolety As Boolean Public Sub New(jmeno As String, pohlavi As Boolean, vek As Integer) Me.jmeno = jmeno Me.muz = pohlavi Me.vek = vek plnolety = True If vek < 18 Then plnolety = False End If End Sub Public Overrides Function ToString() As String Dim jsemPlnolety As String = "jsem" If Not plnolety Then jsemPlnolety = "nejsem" End If Dim pohlavi As String = "muž" If Not muz Then pohlavi = "žena" End If Return String.Format("Jsem {0}, {1}. Je mi {2} let a {3} plnoletý.", jmeno, pohlavi, vek, jsemPlnolety) End Function End Class
výstup:
Konzolová aplikácia
Jsem Pavel Hora, muž. Je mi 20 let a jsem plnoletý.
Všetko vyzerá pekne, ale atribúty sú prístupné ako na čítanie, tak na zápis. Objekt teda môžeme rozbiť napríklad takto (hovoríme o nekonzistentnom vnútorným stave):
{VBNET_CONSOLE} Dim s As New Student("Pavel Hora", True, 20) s.vek = 15 s.muz = False Console.WriteLine(s) Console.ReadKey() {/VBNET_CONSOLE}
Class Student Public jmeno As String Public muz As Boolean Public vek As Integer Public plnolety As Boolean Public Sub New(jmeno As String, pohlavi As Boolean, vek As Integer) Me.jmeno = jmeno Me.muz = pohlavi Me.vek = vek plnolety = True If vek < 18 Then plnolety = False End If End Sub Public Overrides Function ToString() As String Dim jsemPlnolety As String = "jsem" If Not plnolety Then jsemPlnolety = "nejsem" End If Dim pohlavi As String = "muž" If Not muz Then pohlavi = "žena" End If Return String.Format("Jsem {0}, {1}. Je mi {2} let a {3} plnoletý.", jmeno, pohlavi, vek, jsemPlnolety) End Function End Class
výstup:
Konzolová aplikácia
Jsem Pavel Hora, žena. Je mi 15 let a jsem plnoletý.
Určite musíme ošetriť, aby sa plnoletosť obnovila pri zmene veku. Keď sa zamyslíme nad ostatnými atribúty, nie je najmenší dôvod, aby sme ich taktiež umožňovali modifikovať. Študent si za normálnych okolností asi len ťažko zmení pohlavia alebo meno. Bolo by však zároveň vhodné ich vystaviť na čítanie, nemôžeme je teda iba iba nastaviť ako Private. V skorších dieloch seriálu sme na tento účel používali metódy, ktoré slúžili na čítanie privátnych atribútov. Ich názov sme volili ako VratVek () a podobne. Na čítanie vybraných atribútov vytvoríme tiež metódy a atribúty označíme ako privátne. Trieda by novo vyzerala napr. Takto (vynechal som konštruktor a toString ()):
Class Student Private jmeno As String Private muz As Boolean Private vek As Integer Private plnolety As Boolean ... Public Function VratJmeno() As String Return jmeno End Function Public Function VratPlnoletost() As Boolean Return plnolety End Function Public Function VratVek() As Integer Return vek End Function Public Function Muz() As String Return muz End Function Public Sub NastavVek(hodnota As Integer) vek = hodnota ' přehodnocení plnoletosti plnolety = True If vek < 18 Then plnolety = False End If End Sub End Class
Metódy, čo hodnoty len vracajú, sú veľmi jednoduché. Nastavenie veku má už nejakú vnútornú logiku, pri jeho zmene musíme totiž prehodnotiť atribút plnoletá. Zaistili sme, že sa do premenných nedá zapisovať inak, ako my chceme. Máme teda pod kontrolou všetky zmeny atribútov a dokážeme na ne reagovať. Nemôže sa stať, že by nám niekto vnútorný stav nekontrolovane menil a rozbil.
Metódam na vrátenie hodnoty sa hovorí Getter a metódam pre zápis setter. Pre editáciu ostatných atribútov by sme urobili jednu metódu EditujStudenta, ktorá by bola podobná konstruktoru. Meno, vek a podobne by sa teda menili pomocou tejto metódy, tam by sme mohli napr. Konstrolovat, či hodnoty dávajú zmysel, opäť by sme odchytili všetky pokusy o zmenu na jedinom mieste. Ručné písanie Getter a setter je určite veľmi prácne. Nemohol by to urobiť niekto za nás? Áno, VB.NET nám ich vie vygenerovať. Potom už nehovoríme o atribútoch, ale o vlastnostiach.
Syntax vlastnosti je veľmi podobná atribútu:
Public Property Jmeno As String
Sprvu to vyzerá, ako by sme deklarovali atribút. Meno vlastnosti je však veľkým písmenom, jedná sa totiž o metódu (presnejšie 2 metódy). Ešte k deklarácii musíme pridať kľúčové slovo Property. V ukážke vyššie sa vygeneruje setter aj getter, vlastnosť pôjde teda normálne čítať aj modifikovať:
Console.WriteLine(objekt.Jmeno)' číst
objekt.Jmeno = "Jan Malý"' zapisovat
Jediný rozdiel oproti atribútu je zvonku v tom, že začiatočné písmeno je veľké. VB.NET v skutočnosti vygeneruje privátnej atribút ak nemu dve metódy, ktoré podľa kontextu volá (spozná podľa situácie či čítame alebo zapisujeme). Ak chceme uviesť vlastné setter a getter, je syntax nasledovné:
Private _jmeno As String Public Property Jmeno As String Get Return _jmeno End Get Set(value As String) _jmeno = value End Set End Property
U vlastné deklarácia si hodnotu ešte niekde musíme pamätať, dáva sa do privátneho atribútu, zvyčajne ho pomenujeme podčiarkovník a názov vlastnosti s malým začiatočným písmenom.
Keď do vlastnosti nevygeneruje setter, nepôjde meniť zvnútra ani zvonku. Ak si želáme, aby vlastnosť nešla mimo triedu meniť, označíme getter ako privátne:
Public Property Jmeno() As String Get Return _jmeno End Get Private Set(value As String) _jmeno = Value End Set End Property Private _jmeno As String
Tohto budeme hojne využívať a práve takto bude vyzerať väčšina vlastností našich budúcich tried.
V Getter alebo Setter sa toho môže samozrejme robiť viac, než len načítanie / zápis hodnoty, pokiaľ si ho definujeme ručne. Ukážme si to na našom príklade s dosiahnutím plnoletosti, ktorá sa musí po zmene veku prehodnotiť:
Private _vek As Integer Public Property Vek() As Integer Get Return _vek End Get Set(value As Integer) _vek = value ' kontrola plnoletosti Plnolety = True If _vek < 18 Then Plnolety = False End If End Set End Property
Sprvu je nutné si vytvoriť privátne premennú spevokol s malým písmenom, v ktorej bude hodnota v skutočnosti uložené. V Getter a setter potom pracujeme s touto premennou, ak použijete v get alebo set Vek, program sa zacyklí!. Nie je možné definovať len getter alebo setter, buď sa obaja vygenerujú sami alebo oba definujeme ručne. Pre prístup k zadanej hodnote je nám v setter k dispozícii kľúčové slovo Value. Takto sa vo VB.NET do verzie 4.0 museli definovať všetky vlastnosti, až potom Microsoft zaviedol tzv. Autoimplementaci a skrátený zápis, aký sme si uviedli vyššie. U drvivej väčšiny vlastností totiž v metódach nepotrebujeme žiadnu logiku. S Vek teraz pracujeme opäť rovnako, ako s atribútom, len s veľkým písmenom. Nenápadné priradenie do veku vnútorne spustí ďalšiu logiku k prehodnoteniu vlastnosti plnoletá:
objekt.Vek = 15 ' nyní se změní i plnoletost
Rovnako môžeme pochopiteľne implementovať aj getter a napríklad niečo niekam logovať.
Upravíme si našu triedu Študent tak, aby používala vlastnosti. Vyzerala by takto:
Class Student Private _jmeno As String Public Property Jmeno() As String Get Return _jmeno End Get Private Set(value As String) _jmeno = Value End Set End Property Private _muz As Boolean Public Property Muz() As Boolean Get Return _muz End Get Private Set(value As Boolean) _muz = Value End Set End Property Private _plnolety As Boolean Public Property Plnolety() As Boolean Get Return _plnolety End Get Private Set(value As Boolean) _plnolety = Value End Set End Property Private _vek As Integer Public Property Vek() As Integer Get Return _vek End Get Set(value As Integer) _vek = value ' kontrola plnoletosti Plnolety = True If _vek < 18 Then Plnolety = False End If End Set End Property Public Sub New(jmeno As String, pohlavi As Boolean, vek As Integer) EditujStudenta(jmeno, pohlavi, vek) End Sub Public Sub EditujStudenta(jmeno As String, muz As Boolean, vek As Integer) Me.Jmeno = jmeno Me.Muz = muz Me.Vek = vek End Sub Public Overrides Function ToString() As String Dim jsemPlnolety As String = "jsem" If Not Plnolety Then jsemPlnolety = "nejsem" End If Dim pohlavi As String = "muž" If Not Muz Then pohlavi = "žena" End If Return String.Format("Jsem {0}, {1}. Je mi {2} let a {3} plnoletý.", jmeno, pohlavi, vek, jsemPlnolety) End Function End Class
Vlastnosti budeme odteraz používať stále, umožňujú nám totiž objekty dokonale zapouzdřit. V .NET sú všetky verejné atribúty tried vlastnosti (napr. Nám známa vlastnosť Length na stringu), platí pravidlo, že čo ide von je vlastnosť, čo sa používa len vo vnútri je privátne atribút. Verejný atribút sa defakto príliš nepoužíva. Celú triedu is ukážkovým programom si samozrejme opäť môžete stiahnuť pod článkom. Kontrolu plnoletosti môžeme z konstruktoru teraz vybrať, akonáhle totiž dosadíme do vlastnosti Vek, nastaví sa plnoletosť sama. Ešte si opäť vyskúšajme problémový príklad:
{VBNET_CONSOLE} Dim s As New Student("Pavel Hora", True, 20) s.vek = 15 ' s.pohlavi = False ' tento řádek nyní způsobí chybu a musí být odebrán Console.WriteLine(s) {/VBNET_CONSOLE}
Class Student Private _jmeno As String Public Property Jmeno() As String Get Return _jmeno End Get Private Set(value As String) _jmeno = Value End Set End Property Private _muz As Boolean Public Property Muz() As Boolean Get Return _muz End Get Private Set(value As Boolean) _muz = Value End Set End Property Private _plnolety As Boolean Public Property Plnolety() As Boolean Get Return _plnolety End Get Private Set(value As Boolean) _plnolety = Value End Set End Property Private _vek As Integer Public Property Vek() As Integer Get Return _vek End Get Set(value As Integer) _vek = value ' kontrola plnoletosti Plnolety = True If _vek < 18 Then Plnolety = False End If End Set End Property Public Sub New(jmeno As String, pohlavi As Boolean, vek As Integer) EditujStudenta(jmeno, pohlavi, vek) End Sub Public Sub EditujStudenta(jmeno As String, muz As Boolean, vek As Integer) Me.Jmeno = jmeno Me.Muz = muz Me.Vek = vek End Sub Public Overrides Function ToString() As String Dim jsemPlnolety As String = "jsem" If Not Plnolety Then jsemPlnolety = "nejsem" End If Dim pohlavi As String = "muž" If Not Muz Then pohlavi = "žena" End If Return String.Format("Jsem {0}, {1}. Je mi {2} let a {3} plnoletý.", jmeno, pohlavi, vek, jsemPlnolety) End Function End Class
A výstup:
Konzolová aplikácia
Jsem Pavel Hora, muž. Je mi 15 let a nejsem plnoletý.
Ak celú vlastnosť označíme ako private, nemožno potom setter alebo Getter označiť ako public.
V budúcej lekcii, Dátum a čas vo Visual Basic .NET , sa pozrieme, ako sa v .NET pracuje s dátumom a časom.
Mal si s čímkoľvek problém? Stiahni si vzorovú aplikáciu nižšie a porovnaj ju so svojím projektom, chybu tak ľahko nájdeš.
Stiahnuť
Stiahnutím nasledujúceho súboru súhlasíš s licenčnými podmienkami
Stiahnuté 189x (58.29 kB)
Aplikácia je vrátane zdrojových kódov v jazyku VB