IT rekvalifikácia. Seniorní programátori zarábajú až 6 000 €/mesiac a rekvalifikácia je prvým krokom. Zisti, ako na to!

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:

Dim s As New Student("Pavel Hora", True, 20)
Console.WriteLine(s)

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):

Dim s As New Student("Pavel Hora", True, 20)
s.vek = 15
s.muz = False
Console.WriteLine(s)
Console.ReadKey()

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:

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)

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

 

Predchádzajúci článok
Riešené úlohy k 9. lekcii OOP v VB .NET
Všetky články v sekcii
Objektovo orientované programovanie vo Visual Basic .NET
Preskočiť článok
(neodporúčame)
Dátum a čas vo Visual Basic .NET
Článok pre vás napísal Michal Žůrek - misaz
Avatar
Užívateľské hodnotenie:
Ešte nikto nehodnotil, buď prvý!
Autor se věnuje tvorbě aplikací pro počítače, mobilní telefony, mikroprocesory a tvorbě webových stránek a webových aplikací. Nejraději programuje ve Visual Basicu a TypeScript. Ovládá HTML, CSS, JavaScript, TypeScript, C# a Visual Basic.
Aktivity