Objekty a třídy v Visual Basic

Objekt je kombinace kódu a dat, která lze považovat za jednotku. Objekt může být součástí aplikace, například ovládací prvek nebo formulář. Celá aplikace může být také objektem.

Při vytváření aplikace v Visual Basic budete neustále pracovat s objekty. Objekty poskytované Visual Basic, jako jsou ovládací prvky, formuláře a objekty přístupu k datům, můžete použít. Můžete také použít objekty z jiných aplikací v rámci vaší Visual Basic aplikace. Můžete dokonce vytvořit vlastní objekty a definovat pro ně další vlastnosti a metody. Objekty fungují jako prefabrikované stavební bloky pro programy – umožňují vám napsat část kódu jednou a znovu ji znovu použít.

Toto téma podrobně popisuje objekty.

Objekty a třídy

Každý objekt v Visual Basic je definován třídou. Třída popisuje proměnné, vlastnosti, procedury a události objektu. Objekty jsou instancemi tříd; Po definování třídy můžete vytvořit libovolný počet objektů, které potřebujete.

Abyste pochopili vztah mezi objektem a jeho třídou, představte si řezačky souborů cookie a soubory cookie. Řezač souborů cookie je třída. Definuje charakteristiky jednotlivých souborů cookie, například velikost a tvar. Třída slouží k vytváření objektů. Objekty jsou soubory cookie.

Před přístupem ke svým členům musíte vytvořit objekt, s výjimkou Shared členů, ke kterým lze přistupovat bez objektu třídy.

Vytvoření objektu z třídy

  1. Určete, z jaké třídy chcete vytvořit objekt, nebo definujte vlastní třídu. Příklad:

    Public Class Customer
        Public Property AccountNumber As Integer
    End Class
    
  2. Napište příkaz Dim , který vytvoří proměnnou, ke které můžete přiřadit instanci třídy. Proměnná by měla být typu požadované třídy.

    Dim nextCustomer As Customer
    
  3. Přidejte klíčové slovo New Operator pro inicializaci proměnné do nové instance třídy.

    Dim nextCustomer As New Customer
    
  4. Teď můžete přistupovat k členům třídy prostřednictvím proměnné objektu.

    nextCustomer.AccountNumber = lastAccountNumber + 1
    

Poznámka

Kdykoli je to možné, měli byste deklarovat proměnnou jako typ třídy, kterou chcete přiřadit. Označuje se jako časná vazba. Pokud v době kompilace neznáte typ třídy, můžete vyvolat pozdní vazbu deklarací proměnné jako datového typu objektu. Pozdní vazba ale může zpomalit výkon a omezit přístup k členům objektu za běhu. Další informace naleznete v tématu Deklarace proměnné objektu.

Několik instancí

Objekty nově vytvořené z třídy jsou často identické s jednotlivými objekty. Jakmile však existují jako jednotlivé objekty, mohou být jejich proměnné a vlastnosti změněny nezávisle na ostatních instancích. Pokud například do formuláře přidáte tři zaškrtávací políčka, každý objekt zaškrtávacího políčka je instancí CheckBox třídy. Jednotlivé CheckBox objekty sdílejí společnou sadu charakteristik a schopností (vlastnosti, proměnné, procedury a události) definované třídou. Každý má vlastní název, může být samostatně povolený a zakázaný a může být umístěn do jiného umístění ve formuláři.

Členové objektů

Objekt je prvek aplikace představující instanci třídy. Pole, vlastnosti, metody a události jsou stavebními bloky objektů a představují jejich členy.

Přístup ke členu

K členu objektu se dostanete tak, že zadáte v pořadí název proměnné objektu, tečku (.) a název člena. Následující příklad nastaví Text vlastnost objektu Label .

warningLabel.Text = "Data not saved"

Výpis členů IntelliSense

IntelliSense zobrazí seznam členů třídy při vyvolání jeho možnosti Členové seznamu, například když zadáte tečku (.) jako operátor přístupu člena. Pokud zadáte tečku za názvem proměnné deklarované jako instance této třídy, IntelliSense zobrazí seznam všech členů instance a žádné ze sdílených členů. Pokud zadáte tečku za samotným názvem třídy, IntelliSense zobrazí seznam všech sdílených členů a žádného člena instance. Další informace najdete v tématu Použití technologie IntelliSense.

Pole a vlastnosti

Pole a vlastnosti představují informace uložené v objektu. Jejich hodnoty načtete a nastavíte pomocí příkazů přiřazení stejným způsobem, jakým načtete a nastavíte místní proměnné v rámci procedury. Následující příklad načte Width vlastnost a nastaví ForeColor vlastnost objektu Label .

Dim warningWidth As Integer = warningLabel.Width
warningLabel.ForeColor = System.Drawing.Color.Red

Všimněte si, že pole se označuje také jako členová proměnná.

Postupy vlastností použijte v následujících případech:

  • Musíte určit, kdy a jak je nastavena nebo načtena hodnota.

  • Vlastnost má dobře definovanou sadu hodnot, které je potřeba ověřit.

  • Nastavení hodnoty způsobí, že některé znatelné změny ve stavu objektu, jako IsVisible je například vlastnost.

  • Nastavení vlastnosti způsobí změny jiných interních proměnných nebo hodnot jiných vlastností.

  • Před nastavením nebo načtením vlastnosti je nutné provést sadu kroků.

Pole použijte, když:

  • Hodnota je typu samoobslužného ověřování. K chybě nebo automatickému převodu dat dochází například v případě, že je k proměnné přiřazena jiná hodnota než TrueFalse nebo je přiřazena Boolean .

  • Jakákoli hodnota v oblasti podporované datovým typem je platná. To platí pro mnoho vlastností typu Single nebo Double.

  • Vlastnost je String datový typ a neexistuje žádné omezení velikosti nebo hodnoty řetězce.

  • Další informace naleznete v tématu Procedury vlastností.

Tip

Vždy udržujte nekonstanční pole soukromá. Pokud ho chcete zpřístupnit jako veřejnou, použijte místo toho vlastnost.

Metody

Metoda je akce, kterou může objekt provést. Jedná se například Add o metodu objektu ComboBox , která přidá novou položku do pole se seznamem.

Následující příklad ukazuje Start metodu objektu Timer .

Dim safetyTimer As New System.Windows.Forms.Timer
safetyTimer.Start()

Všimněte si, že metoda je jednoduše procedura , která je vystavena objektem.

Další informace najdete v tématu Postupy.

událost

Událost je akce rozpoznaná objektem, například kliknutím na myš nebo stisknutím klávesy a pro kterou můžete napsat kód pro odpověď. Události můžou nastat v důsledku akce uživatele nebo kódu programu nebo mohou být způsobeny systémem. Kód, který signalizuje, že událost vyvolá událost, a kód, který na ni reaguje, je řečeno, aby ji zvládl .

Můžete také vyvíjet vlastní události, které mají být vyvolány vašimi objekty a zpracovány jinými objekty. Další informace najdete v tématu Události.

Členové instance a sdílené členy

Při vytváření objektu z třídy je výsledkem instance této třídy. Členy, které nejsou deklarovány pomocí sdíleného klíčového slova, jsou členy instance, které patří výhradně do této konkrétní instance. Člen instance v jedné instanci je nezávislý na stejném členu v jiné instanci stejné třídy. Například členová proměnná instance může mít různé hodnoty v různých instancích.

Členové deklarovaní s klíčovým slovem Shared jsou sdílené členy, které patří do třídy jako celku, a ne do žádné konkrétní instance. Sdílený člen existuje pouze jednou, bez ohledu na to, kolik instancí jeho třídy vytvoříte, nebo dokonce i v případě, že vytváříte žádné instance. Sdílená členová proměnná má například pouze jednu hodnotu, která je k dispozici pro veškerý kód, který má přístup ke třídě.

Přístup k nesdílením členům

  1. Ujistěte se, že byl objekt vytvořen ze své třídy a přiřazen k proměnné objektu.

    Dim secondForm As New System.Windows.Forms.Form
    
  2. V příkazu, který přistupuje k členu, postupujte podle názvu proměnné objektu pomocí operátoru přístupu člena (.) a pak název člena.

    secondForm.Show()
    

Přístup ke sdíleným členům

  • Postupujte podle názvu třídy s operátorem přístupu člena (.) a pak název člena. Vždy byste měli přistupovat k Shared členu objektu přímo prostřednictvím názvu třídy.

    Console.WriteLine("This computer is called " & Environment.MachineName)
    
  • Pokud jste již vytvořili objekt z třídy, můžete k členovi Shared získat přístup prostřednictvím proměnné objektu.

Rozdíly mezi třídami a moduly

Hlavním rozdílem mezi třídami a moduly je, že třídy lze vytvořit instanci jako objekty, zatímco standardní moduly nemohou. Vzhledem k tomu, že existuje pouze jedna kopie dat standardního modulu, když jedna část programu změní veřejnou proměnnou ve standardním modulu, jakákoli jiná část programu získá stejnou hodnotu, pokud pak přečte tuto proměnnou. Naproti tomu data objektů existují pro každý objekt vytvořený zvlášť. Dalším rozdílem je, že na rozdíl od standardních modulů můžou třídy implementovat rozhraní. Pokud je třída označena modifikátorem MustInherit , nedá se vytvořit instance přímo. Stále se ale liší od modulu, protože se dá dědit, zatímco moduly se nedědí.

Poznámka

Shared Pokud je modifikátor použit na člen třídy, je přidružen k samotné třídě místo konkrétní instance třídy. Člen je přístupný přímo pomocí názvu třídy, stejně jako členové modulu jsou přístupní.

Třídy a moduly také používají pro své členy různé obory. Členy definované v rámci třídy jsou vymezeny v rámci konkrétní instance třídy a existují pouze po dobu života objektu. Pokud chcete získat přístup k členům třídy mimo třídu, musíte použít plně kvalifikované názvy ve formátu Objekt. Člen.

Na druhou stranu jsou členové deklarovaní v rámci modulu ve výchozím nastavení veřejně přístupní a můžou k němu přistupovat libovolným kódem, který má přístup k modulu. To znamená, že proměnné ve standardním modulu jsou efektivně globální proměnné, protože jsou viditelné odkudkoliv v projektu a existují po dobu životnosti programu.

Opakované použití tříd a objektů

Objekty umožňují deklarovat proměnné a procedury jednou a pak je kdykoliv znovu použít. Pokud například chcete do aplikace přidat kontrolu pravopisu, můžete definovat všechny proměnné a podpůrné funkce pro zajištění funkce kontroly pravopisu. Pokud vytvoříte kontrolu pravopisu jako třídu, můžete ji znovu použít v jiných aplikacích přidáním odkazu na kompilované sestavení. Ještě lepší je, že si můžete uložit nějakou práci pomocí třídy kontroly pravopisu, kterou už vytvořil někdo jiný.

.NET poskytuje mnoho příkladů komponent, které jsou k dispozici pro použití. Následující příklad používá TimeZone třídu v System oboru názvů. TimeZone poskytuje členy, které umožňují načíst informace o časovém pásmu aktuálního počítačového systému.

Public Sub ExamineTimeZone()
    Dim tz As System.TimeZone = System.TimeZone.CurrentTimeZone
    Dim s As String = "Current time zone is "
    s &= CStr(tz.GetUtcOffset(Now).Hours) & " hours and "
    s &= CStr(tz.GetUtcOffset(Now).Minutes) & " minutes "
    s &= "different from UTC (coordinated universal time)"
    s &= vbCrLf & "and is currently "
    If tz.IsDaylightSavingTime(Now) = False Then s &= "not "
    s &= "on ""summer time""."
    Console.WriteLine(s)
End Sub

V předchozím příkladu první příkaz Dim deklaruje proměnnou objektu typu TimeZone a přiřadí k němu TimeZone objekt vrácený CurrentTimeZone vlastností.

Vztahy mezi objekty

Objekty mohou vzájemně souviset několika způsoby. Hlavní druhy vztahů jsou hierarchické a zachytávají.

Hierarchický vztah

Když jsou třídy odvozeny od základních tříd, říká se, že mají hierarchický vztah. Hierarchie tříd jsou užitečné při popisu položek, které jsou podtypu obecnější třídy.

V následujícím příkladu předpokládejme, že chcete definovat speciální druh Button , který funguje jako normální Button , ale také zveřejňuje metodu, která obrátí barvy popředí a pozadí.

Definování třídy odvozené z již existující třídy

  1. Pomocí příkazu třídy definujte třídu, ze které chcete vytvořit objekt, který potřebujete.

    Public Class ReversibleButton
    

    Ujistěte se, že End Class příkaz sleduje poslední řádek kódu ve třídě. Integrované vývojové prostředí (IDE) ve výchozím nastavení automaticky vygeneruje End Class při zadávání Class příkazu příkaz.

  2. Postupujte podle příkazu Class okamžitě pomocí příkazu Inherits. Zadejte třídu, ze které je nová třída odvozena.

    Inherits System.Windows.Forms.Button
    

    Nová třída dědí všechny členy definované základní třídou.

  3. Přidejte kód pro další členy, které vaše odvozená třída zveřejňuje. Můžete například přidat metodu ReverseColors a odvozená třída může vypadat takto:

    Public Class ReversibleButton
        Inherits System.Windows.Forms.Button
            Public Sub ReverseColors()
                Dim saveColor As System.Drawing.Color = Me.BackColor
                Me.BackColor = Me.ForeColor
                Me.ForeColor = saveColor
           End Sub
    End Class
    

    Pokud vytvoříte objekt z ReversibleButton třídy, bude mít přístup ke všem členům Button třídy, stejně jako k ReverseColors metodě a dalším novým členům, které definujete v ReversibleButton.

Odvozené třídy dědí členy z třídy, na které jsou založeny, což vám umožní přidat složitost při pokroku v hierarchii tříd. Další informace naleznete v tématu Základy dědičnosti.

Kompilace kódu

Ujistěte se, že kompilátor má přístup ke třídě, ze které chcete odvodit novou třídu. To může znamenat plně kvalifikovaný název, například v předchozím příkladu, nebo identifikaci oboru názvů v příkazu Import (obor názvů a typ .NET). Pokud je třída v jiném projektu, možná budete muset přidat odkaz na tento projekt. Další informace naleznete v tématu Správa odkazů v projektu.

Vztah členství ve skupině

Dalším způsobem, jak můžou objekty souviset, je vztah zahrnutí. Kontejnerové objekty logicky zapouzdřují další objekty. Objekt například OperatingSystem logicky obsahuje Version objekt, který vrací prostřednictvím své Version vlastnosti. Všimněte si, že objekt kontejneru fyzicky neobsahuje žádný jiný objekt.

Kolekce

Jeden konkrétní typ zachytvání objektu je reprezentován kolekcemi. Kolekce jsou skupiny podobných objektů, které je možné vyčíst. Visual Basic podporuje konkrétní syntaxi v sadě For Each... Další příkaz, který umožňuje iterovat položky kolekce. Kolekce navíc často umožňují použít Item[] k načtení prvků jejich indexem nebo jejich přidružením k jedinečnému řetězci. Kolekce je možné snadněji používat než pole, protože umožňují přidávat nebo odebírat položky bez použití indexů. Z důvodu jejich snadného použití se kolekce často používají k ukládání formulářů a ovládacích prvků.

Návod: Definování tříd
Poskytuje podrobný popis, jak vytvořit třídu.

Vlastnosti a metody přetečení
Vlastnosti a metody přetečení

Základní informace o dědičnosti
Pokrývá modifikátory dědičnosti, přepsání metod a vlastností, MyClass a MyBase.

Doba života objektu: Vytváření a zničení objektů
Popisuje vytváření a rozesílování instancí tříd.

Anonymní typy
Popisuje, jak vytvořit a používat anonymní typy, které umožňují vytvářet objekty bez zápisu definice třídy pro datový typ.

Inicializátory objektů: pojmenované a anonymní typy
Popisuje inicializátory objektů, které se používají k vytváření instancí pojmenovaných a anonymních typů pomocí jednoho výrazu.

Postupy: Odvození názvů a typů vlastností v deklaracích anonymního typu
Vysvětluje, jak odvodit názvy a typy vlastností v deklaracích anonymního typu. Poskytuje příklady úspěšného a neúspěšného odvozování.