Obecné typy v jazyce Visual Basic (Visual Basic)
obecný typ je jeden programovací prvek, který se přizpůsobí provádění stejných funkcí pro více datových typů. Když definujete obecnou třídu nebo proceduru, nemusíte definovat samostatnou verzi pro každý datový typ, pro který byste mohli chtít tuto funkci provést.
Analogie je jako sada šroubováků s vyměnitelnými hlavicemi. Zkontrolujete šroub a vyberete správnou hlavu pro tento šroub (drážkovaný, překřížený, hvězdicový). Jakmile vložíte správnou hlavu do rukojeti šroubováku, provedete přesně stejnou funkci se šroubovákem, konkrétně otáčením šroubu.
Když definujete obecný typ, parametrizujete ho pomocí jednoho nebo více datových typů. Parametry typu umožňují kódu přizpůsobit datové typy svým požadavkům. Váš kód může deklarovat několik různých programovacích prvků od obecného prvku, z nichž každý funguje na jiné sadě datových typů. Deklarované prvky ale provádějí identickou logiku bez ohledu na to, jaké datové typy používají.
Například můžete chtít vytvořit a použít frontovou třídu, která pracuje s konkrétním datovým typem, jako je String
. Můžete deklarovat takovou třídu z System.Collections.Generic.Queue<T>, jak ukazuje následující příklad.
Public stringQ As New System.Collections.Generic.Queue(Of String)
Nyní můžete použít stringQ
k práci výhradně s hodnotami String
. Protože stringQ
je specifický pro String
místo obecného použití pro hodnoty Object
, nemáte pozdní vazbu ani převod typů. Obecné typy šetří čas při provádění a snižují počet chyb za běhu.
Další informace o použití obecného typu naleznete v tématu Postupy: Použití obecné třídy.
Příklad obecné třídy
Následující příklad ukazuje definici kostry obecné třídy.
Public Class classHolder(Of t)
Public Sub processNewItem(ByVal newItem As t)
Dim tempItem As t
' Insert code that processes an item of data type t.
End Sub
End Class
V předchozí kostře je t
parametr typu , tj. zástupný symbol pro datový typ, který zadáte při deklaraci třídy. Jinde v kódu můžete deklarovat různé verze classHolder
zadáním různých datových typů pro t
. Následující příklad ukazuje dvě takové deklarace.
Public integerClass As New classHolder(Of Integer)
Friend stringClass As New classHolder(Of String)
Předchozí příkazy deklarují konstrukci tříd , ve kterých určitý typ nahrazuje typový parametr. Toto nahrazení se rozšíří v celém kódu v rámci konstruované třídy. Následující příklad ukazuje, jak vypadá procedura processNewItem
v integerClass
.
Public Sub processNewItem(ByVal newItem As Integer)
Dim tempItem As Integer
' Inserted code now processes an Integer item.
End Sub
Podrobnější příklad najdete v tématu Postupy: Definování třídy, která může poskytovat identické funkce v různých datových typech.
Způsobilé programovací prvky
Můžete definovat a používat obecné třídy, struktury, rozhraní, procedury a delegáty. .NET definuje několik obecných tříd, struktur a rozhraní, které představují běžně používané obecné elementy. Obor názvů System.Collections.Generic poskytuje slovníky, seznamy, fronty a zásobníky. Před definováním vlastního obecného elementu se podívejte, jestli je již k dispozici v System.Collections.Generic.
Procedury nejsou typy, ale můžete definovat a používat obecné procedury. Viz Obecné procedury v jazyce Visual Basic.
Výhody obecných typů
Obecný typ slouží jako základ pro deklarování několika různých programovacích prvků, z nichž každý pracuje s konkrétním datovým typem. Alternativy k obecnému typu jsou:
- Jeden typ, který pracuje s datovým typem
Object
. - Sada verzí typu specifických pro typ. Každá verze je individuálně kódovaná a funguje na jednom konkrétním datovém typu, jako je
String
,Integer
nebo uživatelem definovaný typ, napříkladcustomer
.
Obecný typ má oproti těmto alternativám následující výhody:
- Bezpečnost typů. Obecné typy vynucují kontrolu typů v čase kompilace. Typy založené na
Object
přijímají libovolný datový typ a je nutné napsat kód, který zkontroluje, jestli je vstupní datový typ přijatelný. U obecných typů může kompilátor zachytit neshody typů před spuštěním. - Výkon. Obecné typy nemusí box a rozbalit data, protože každý z nich je specializovaný pro jeden datový typ. Operace založené na
Object
musí zabalit vstupní datové typy, aby je převedly naObject
a rozbalily data určená pro výstup. Procesy boxing a unboxing snižují výkon. Typy založené naObject
jsou také zpožděné, což znamená, že přístup ke svým členům vyžaduje za běhu další kód. Převody typů také snižují výkon. - Konsolidace kódu. Kód v obecném typu musí být definován pouze jednou. Sada verzí typu musí replikovat stejný kód v každé verzi, přičemž jediným rozdílem je konkrétní datový typ pro danou verzi. U obecných typů jsou všechny verze specifické pro typ generovány z původního obecného typu.
- Opětovné použití kódu Kód, který nezávisí na konkrétním datovém typu, se dá opakovaně použít s různými datovými typy, pokud je obecný. Často ho můžete opakovaně používat i s datovým typem, který jste původně nepředikovali.
- Podpora integrovaného vývojového prostředí (IDE) Když použijete konstruovaný typ deklarovaný z obecného typu, integrované vývojové prostředí (IDE) vám může při vývoji kódu poskytnout větší podporu. IntelliSense například umožňuje zobrazit možnosti specifické pro typ argumentu konstruktoru nebo metody.
- Obecné algoritmy. Abstraktní algoritmy, které jsou nezávislé na typu, jsou vhodnými kandidáty pro obecné typy. Například obecný postup, který seřadí položky pomocí rozhraní IComparable lze použít s libovolným datovým typem, který implementuje IComparable.
Omezení
I když by kód v definici obecného typu měl být co nejvíce nezávislý na typu, možná budete muset vyžadovat určitou schopnost libovolného datového typu zadaného pro obecný typ. Pokud například chcete porovnat dvě položky pro řazení nebo kolaci, musí jejich datový typ implementovat IComparable rozhraní. Tento požadavek můžete vynutit přidáním omezení do parametru typu.
Příklad omezení
Následující příklad ukazuje definici kostry třídy s omezením, která vyžaduje typ argument k implementaci IComparable.
Public Class itemManager(Of t As IComparable)
' Insert code that defines class members.
End Class
Pokud se následující kód pokusí vytvořit třídu z itemManager
s typem, který neimplementuje IComparable, kompilátor signalizuje chybu.
Typy omezení
Vaše omezení může v libovolné kombinaci určit následující požadavky:
- Argument typu musí implementovat jedno nebo více rozhraní.
- Argument typu musí být typu nebo musí být zděděný nejvýše z jedné třídy.
- Argument typu musí zpřístupnit konstruktor bez parametrů přístupný kódu, který z něj vytváří objekty.
- Argument typu musí být referenčního typunebo musí být hodnotového typu
Kód jazyka C# může deklarovat, že argument typu musí být nespravovaný typ. Jazyk Visual Basic vynucuje toto omezení pro kód jazyka Visual Basic, který používá obecný typ nebo metodu definovanou tímto omezením (v jazyce C#). Nemůžete však deklarovat omezení unmanaged
parametru typu v jazyce Visual Basic.
Pokud potřebujete uložit více než jeden požadavek, použijete seznam omezení oddělený čárkami uvnitř složených závorek ({ }
). Chcete-li vyžadovat přístupný konstruktor, zahrňte do seznamu klíčové slovo New Operator. Pokud chcete vyžadovat typ odkazu, zahrnete klíčové slovo Class
; pokud chcete vyžadovat typ hodnoty, zahrnete klíčové slovo Structure
.
Další informace o omezeních naleznete v tématu Seznam typů.
Příklad několika omezení
Následující příklad ukazuje definici kostry obecné třídy se seznamem omezení u parametru typu. V kódu, který vytvoří instanci této třídy, musí argument typu implementovat IComparable i IDisposable rozhraní, být referenčním typem a zpřístupnit přístupný konstruktor bez parametrů.
Public Class thisClass(Of t As {IComparable, IDisposable, Class, New})
' Insert code that defines class members.
End Class
Důležité termíny
Obecné typy zavádějí a používají následující termíny:
- obecný typ. Definice třídy, struktury, rozhraní, procedury nebo delegáta, pro kterou zadáte alespoň jeden datový typ při deklaraci.
- parametr typu. V definici obecného typu slouží zástupný symbol pro datový typ, který zadáte při deklaraci tohoto typu.
- typ argumentu. Konkrétní datový typ, který nahrazuje parametr typu při deklaraci vytvořeného typu z obecného typu.
- omezení. Podmínka parametru typu, který omezuje argument typu, který pro něj můžete zadat. Omezení může vyžadovat, aby argument typu implementoval konkrétní rozhraní, dědil z konkrétní třídy, měl přístupný konstruktor bez parametrů nebo byl odkazového typu nebo typu hodnoty. Tato omezení můžete kombinovat, ale můžete zadat maximálně jednu základní třídu.
- konstrukční typ. Třída, struktura, rozhraní, procedura nebo delegát deklarovaná z obecného typu zadáním argumentů typu pro jeho parametry typu.