Sdílet prostřednictvím


Objekty a třídy v jazyce 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 jazyce Visual Basic neustále pracujete s objekty. Můžete použít objekty poskytované jazykem Visual Basic, jako jsou ovládací prvky, formuláře a objekty přístupu k datům. Můžete také použít objekty z jiných aplikací v aplikaci Visual Basic. 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 jednou napsat kus kódu a znovu ho používat.

Toto téma podrobně popisuje objekty.

Objekty a třídy

Každý objekt v jazyce Visual Basic je definován třídou. Třída popisuje proměnné, vlastnosti, procedury a události objektu. Objekty jsou instance tříd; Jakmile definujete třídu, můžete vytvořit tolik objektů, kolik potřebujete.

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

Před přístupem ke svým členům je nutné 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. Napří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. Nyní můžete přistupovat ke č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 typu třídy, kterou chcete přiřadit. Tomu se říká statická vazba. Pokud v době kompilace neznáte typ třídy, můžete vyvolat pozdní vazbu deklarací proměnné, která má být datovým typem objektu. Pozdní vazba však může zpomalit výkon a omezit přístup k členům objektu runtime. Další informace naleznete v tématu Deklarace proměnné objektu.

Několik instancí

Objekty nově vytvořené z třídy jsou často identické navzájem. Jakmile však existují jako jednotlivé objekty, jejich proměnné a vlastnosti lze změnit 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 CheckBox políčka je instancí 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ý z nich má ale svůj 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.

Členy objektu

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 člena

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 vypíše členy třídy, když použijete možnost Seznam členů, například když zadáte tečku (.) jako operátor přístupu k členům. Pokud zadáte tečku za názvem proměnné deklarované jako instance této třídy, IntelliSense zobrazí seznam všech instančních členů a žádné ze sdílených členů. Pokud zadáte tečku za názvem třídy, IntelliSense zobrazí seznam všech sdílených členů, ale ne žádných členů 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 postupu. 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 se hodnota nastavuje nebo načítá.

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

  • Nastavení hodnoty způsobí určitou znatelnou změnu ve stavu objektu, například IsVisible 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 samostatně ověřujícího typu. K chybě nebo automatickému převodu dat dojde například v případě, že je proměnné True přiřazena hodnota, která není False ani 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í.

Návod

Vždy ponechejte nekonstantní pole soukromá. Pokud ho chcete nastavit jako veřejnou, použijte místo toho vlastnost.

Metody

Metoda je akce, kterou může objekt provést. Například Add je metoda objektu ComboBox, která přidá novou položku do kombinovaného boxu.

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 naleznete v tématu Procedury.

Události

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, který má reagovat. 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 událost, vyvolává událost, a kód, který na ni reaguje, se říká, že ji zpracovává.

Můžete také vyvíjet vlastní události, které budou vyvolány vašimi objekty a zpracovány jinými objekty. Další informace naleznete v části Události .

Členové instancí a sdílení členové

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ří přísně 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 proměnná člena instance může mít různé hodnoty v různých instancích.

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

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

  1. Ujistěte se, že objekt byl 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, za názvem proměnné objektu následuje operátor přístupu člena (.) a poté zadejte název člena.

    secondForm.Show()
    

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

  • Postupujte podle názvu třídy pomocí operátoru přístupu člena (.) a potom názvu č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 členu Shared přistupovat 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 vytvářet jako instance objektů, zatímco standardní moduly nemohou být vytvořeny jako instance objektů. 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, získá jakákoli jiná část programu stejnou hodnotu, pokud pak přečte tuto proměnnou. Naproti tomu data objektu existují samostatně pro každý instanciovaný objekt. Dalším rozdílem je, že na rozdíl od standardních modulů mohou třídy implementovat rozhraní. Pokud je třída označena modifikátorem MustInherit , nelze ji vytvořit přímo. Stále se ale liší od modulu, protože se dá zdě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. K členu se přistupuje přímo pomocí názvu třídy, stejně jako k členům modulu se přistupuje.

Třídy a moduly také používají pro své členy různé rozsahy. Č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 Object. Člen.

Na druhou stranu jsou členové deklarovaní v rámci modulu ve výchozím nastavení veřejně přístupní a můžou k nim přistupovat libovolný kód, který má přístup k modulu. To znamená, že proměnné ve standardním modulu jsou v podstatě globální proměnné, protože jsou viditelné odkudkoli v projektu a existují po celý život programu.

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

Objekty umožňují deklarovat proměnné a procedury jednou a pak je opakovaně používat, kdykoli je potřebujete. 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í kontroly pravopisu. Pokud vytváří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 ušetřit určitou 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á třídu TimeZone v oboru názvů System. TimeZone poskytuje členy, kteří 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í Dim Příkaz deklaruje proměnnou typu objektu TimeZone a přiřadí k němu objekt TimeZone, který je vrácen vlastností CurrentTimeZone.

Vztahy mezi objekty

Objekty mohou být vzájemně propojeny několika způsoby. Hlavní druhy vztahů jsou hierarchické a obsahové.

Hierarchický vztah

Když jsou třídy odvozeny z nejzákladnější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 class definujte třídu, ze které chcete vytvořit požadovaný objekt.

    Public Class ReversibleButton
    

    Ujistěte se, že příkaz End Class následuje za posledním řádkem kódu ve vaší 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.

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

    Inherits System.Windows.Forms.Button
    

    Vaše 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 ReverseColors k metodě a všem 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ž umožňuje přidat složitost při postupu 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ě kvalifikovat jeho název, například v předchozím příkladu, nebo identifikaci jeho oboru názvů pomocí příkazu Imports (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 ohraničení

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

Sbírky

Jeden konkrétní typ zahrnutí objektu je reprezentován kolekcemi. Kolekce jsou skupiny podobných objektů, které lze vytvořit výčet. Jazyk Visual Basic podporuje konkrétní syntaxi v příkazu For Each...Next, který umožňuje iteraci položek kolekce. Kolekce navíc často umožňují použít Item[] k načtení prvků pomocí jejich indexu 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
Obsahuje podrobný popis postupu vytvoření třídy.

Přetížené vlastnosti a metody
Přetížené vlastnosti a metody

Základy dědičnosti
Zahrnuje modifikátory dědičnosti, překrytí metod a vlastností, MyClass a MyBase.

Životnost objektu: Způsob vytváření a zničení objektů
Popisuje vytváření a odstraňování instancí třídy.

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 vytvoř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ých a neúspěšných odvozování.