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 neustále pracujete s objekty. Můžete použít objekty poskytované objekty 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 rámci Visual Basic aplikace. Můžete dokonce vytvořit vlastní objekty a definovat pro ně další vlastnosti a metody. Objekty se pro programy chová jako předem hotové stavební bloky – umožňují vám jednou napsat část kódu a opakovaně ji používat.

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 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, pomyslete na soubory cookie a soubory cookie. Soubor 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.

Objekt je nutné vytvořit před přístupem k jeho členům, s výjimkou členů, ke kterým lze přistupovat bez Shared objektu třídy.

Vytvoření objektu z třídy

  1. Určete, ze které třídy chcete vytvořit objekt, nebo definujte vlastní třídu. Například:

    Public Class Customer
        Public Property AccountNumber As Integer
    End Class
    
  2. Zápisem příkazu Dim vytvořte 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 objektové proměnné.

    nextCustomer.AccountNumber = lastAccountNumber + 1
    

Poznámka

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

Několik instancí

Objekty nově vytvořené ze třídy jsou často identické k sobě navzájem. 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, bude každý objekt zaškrtávacího políčka instancí CheckBox třídy . Jednotlivé objekty sdílejí společnou sadu vlastností a schopností (vlastnosti, proměnné, procedury a události) definované CheckBox třídou . Každý má ale svůj vlastní název, může být samostatně povolen a zakázán a může být umístěn na jiném místě 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 tvoří jejich členy.

Přístup ke členu

Ke členu objektu se přistupuje zadáním (v pořadí) názvu objektové proměnné, tečky ( ) a . názvu členu. Následující příklad nastaví Text vlastnost Label objektu .

warningLabel.Text = "Data not saved"

Seznam členů technologie IntelliSense

IntelliSense vypíše členy třídy při vyvolání její možnosti Seznam členů, například když jako operátor přístupu ke členu napíšete tečku ( . ). Pokud za název proměnné deklarované jako instanci této třídy zapíšete tečku, IntelliSense vypíše všechny členy instance a žádné sdílené členy. Pokud za samotný název třídy zapíšete tečku, IntelliSense vypíše všechny sdílené členy a žádné členy instance. Další informace najdete v tématu Používání technologie IntelliSense.

Pole a vlastnosti

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

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

Všimněte si, že pole se také nazývá členské proměnné.

Postupy vlastností použijte v těchto případě:

  • Musíte řídit, kdy a jak se hodnota nastaví nebo načte.

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

  • Nastavení hodnoty způsobí určité znatelné změny ve stavu objektu, například IsVisible vlastnost .

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

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

Pole použijte v těchto případě:

  • Hodnota je typu s vlastním ověřením. K chybě nebo automatickému převodu dat může dojít například v případě, že je proměnné přiřazena jiná hodnota než True False nebo Boolean .

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

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

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

Tip

Ne constantová pole vždy udržujte soukromá. Pokud chcete, aby byla veřejná, použijte místo toho vlastnost .

Metody

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

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

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álosti

Událost je akce rozpoznávaná objektem, například kliknutí myší nebo stisknutím klávesy a pro kterou můžete napsat kód pro reakci. K událostem může dojít v důsledku akce uživatele nebo kódu programu nebo může být způsobena systémem. O kódu, který signalizuje událost, se říká, že událost vyvolává, a kód, který na událost reaguje, se říká, že ji zpracovat.

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

Členové instance a sdílené členy

Když vytvoříte objekt z třídy, výsledkem je instance této třídy. Členy, které nejsou deklarovány s klíčovým slovem Shared, 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. Členské proměnné instance mohou mít například různé hodnoty v různých instancích.

Členy deklarované pomocí klíčového slova jsou sdílené členy , které patří do třídy jako celek, a ne Shared do žádné konkrétní instance. Sdílený člen existuje pouze jednou bez ohledu na to, kolik instancí své třídy vytvoříte, nebo i když žádné instance vytvoříte. Sdílená členná 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 nes sdíleným členům

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

    Dim secondForm As New System.Windows.Forms.Form
    
  2. V příkazu, který přistupuje ke členu, použijte název proměnné objektu s operátorem přístupu členů ( ) a . potom názvem členu.

    secondForm.Show()
    

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

  • Použijte název třídy s operátorem přístupu ke členu ( ) a . potom názvem členu. Vždy byste měli Shared přistupovat ke č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 alternativně přistupovat ke členu prostřednictvím Shared proměnné objektu.

Rozdíly mezi třídami a moduly

Hlavní rozdíl mezi třídami a moduly spočívá v tom, že třídy lze vytvořit jako objekty, zatímco standardní moduly ne. 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 tuto proměnnou přečte. Naproti tomu data objektu existují samostatně pro každý objekt s vytvořenou instancí. 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 může dědit, zatímco moduly se nezdědí.

Poznámka

Pokud je modifikátor použit na člen třídy, je přidružen k samotné třídě namísto Shared konkrétní instance třídy. Ke členu se přistupuje přímo pomocí názvu třídy stejným způsobem, jakým se přistupuje ke členům modulu.

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 životnosti objektu. Pro přístup ke členům třídy mimo třídu je nutné použít plně kvalifikované názvy ve formátu objektu. Člen.

Na druhé straně jsou členy deklarované v rámci modulu ve výchozím nastavení veřejně přístupné a jsou přístupné z libovolného kódu, 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é odkudkoli v projektu a existují po dobu životnosti programu.

Opětovné použití tříd a objektů

Objekty umožňují deklarovat proměnné a procedury jednou a pak je opakovaně používat, kdykoli je to potřeba. Pokud například chcete do aplikace přidat kontrolu pravopisu, můžete definovat všechny proměnné a podpůrné funkce, které zajistí funkce 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 zkompilované sestavení. Ještě lepší je, že si můžete ušetřit práci pomocí třídy kontroly pravopisu, kterou už vytvořil někdo jiný.

.NET poskytuje řadu příkladů komponent, které jsou k dispozici pro použití. Následující příklad používá třídu TimeZone v oboru System 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 objektové proměnné typu a přiřadí mu objekt TimeZone TimeZone vrácený CurrentTimeZone vlastností .

Relace mezi objekty

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

Hierarchický vztah

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

V následujícím příkladu předpokládejme, že chcete definovat speciální druh, který funguje jako normální, ale zároveň zpřístupňuje metodu, která obrátí barvu popředí Button Button a pozadí.

Definujte třídu odvozenou z již existující třídy.

  1. Pomocí příkazu třídy můžete definovat třídu, ze které chcete vytvořit objekt, který potřebujete.

    Public Class ReversibleButton
    

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

  2. Okamžitě za Class příkazem použijte příkaz 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 a odvozená třída ReverseColors 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 třídy , bude mít přístup ke všem členům třídy, stejně jako k metodě a všem dalším novým členům, které ReversibleButton Button ReverseColors 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 postupu v hierarchii tříd. Další informace najdete v tématu Základní informace o 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é kvalifikování jeho názvu jako v předchozím příkladu nebo identifikaci oboru názvů v 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 najdete v tématu Správa odkazů v projektu.

Vztah členství ve skupině

Dalším způsobem, jak mohou být objekty spojené, je vztah obsahující obsah. Objekty kontejneru logicky zapouzdřují jiné objekty. Například objekt OperatingSystem logicky obsahuje Version objekt, který vrací prostřednictvím své vlastnosti Version . Všimněte si, že objekt kontejneru fyzicky neobsahuje žádný jiný objekt.

Kolekce

Jeden konkrétní typ obsahu objektu je reprezentován kolekcemi. Kolekce jsou skupiny podobných objektů, které lze vytvořit výčet. Visual Basic podporuje konkrétní syntaxi v části For Each... Další příkaz, který umožňuje iterovat položkami kolekce. Kolekce navíc často umožňují použít k načtení elementů podle jejich indexu nebo jejich přidružení Item[] k jedinečnému řetězci. Kolekce mohou být jednodušší než pole, protože umožňují přidávat nebo odebírat položky bez použití indexů. Vzhledem k jejich snadnému 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 vytvoření třídy.

Přetížené vlastnosti a metody
Vlastnosti a metody přetečení

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

Doba života objektu: Jak se objekty vytvářejí a zničí
Popisuje vytváření a likvidaci instancí třídy.

Anonymní typy
Popisuje, jak vytvořit a používat anonymní typy, které umožňují vytvářet objekty bez psaní 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: Odvodení 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í.