Obecné typy v jazyce Visual Basic (Visual Basic)

Obecný typ je jeden programovací prvek, který se přizpůsobuje provádění stejných funkcí pro různé datové typy. Při definování obecné třídy nebo procedury nemusíte definovat samostatnou verzi pro každý datový typ, pro který byste mohli chtít tuto funkci provést.

Analogie je šroubovák sada s vyměnitelnými hlavami. Zkontrolujete šroub, který potřebujete otočit, a vybrat 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.

Diagram of a screwdriver set with different heads.

Když definujete obecný typ, parametrizujete ho pomocí jednoho nebo více datových typů. To umožňuje použití 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í.

Můžete například chtít vytvořit a použít třídu fronty, která pracuje s konkrétním datovým typem, například 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)

Teď můžete pracovat stringQ výhradně s String hodnotami. Vzhledem k tomu stringQ , že je specifická pro String místo generalizace pro Object hodnoty, nemáte pozdní vazbu nebo převod typu. Tím se šetří doba provádění a zkracují se chyby 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 t je 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 zadáním různých datových classHolder 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í vytvořené třídy, ve kterých určitý typ nahrazuje parametr typu. Toto nahrazení se rozšíří v celém kódu v rámci konstruované třídy. Následující příklad ukazuje, jak procedura processNewItem vypadá 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 u různých datových typů.

Způsobilé programovací prvky

Můžete definovat a používat obecné třídy, struktury, rozhraní, procedury a delegáty. Všimněte si, že rozhraní .NET Framework definuje několik obecných tříd, struktur a rozhraní, které představují běžně používané obecné prvky. Obor System.Collections.Generic názvů poskytuje slovníky, seznamy, fronty a zásobníky. Před definováním vlastního obecného prvku zjistěte, zda 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:

  1. Jeden typ, který pracuje s datovým typem Object .

  2. Sada verzí typu, každá verze individuálně zakódovaná a pracuje s jedním konkrétním datovým typem, například String, Integernebo uživatelem definovaným typem, například customer.

Obecný typ má oproti těmto alternativám následující výhody:

  • Zadejte Sejf ty. Obecné typy vynucují kontrolu typů v čase kompilace. Typy založené na Object přijetí libovolného datového typu 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í data rámeček a rozbalit , protože každá z nich je specializovaná pro jeden datový typ. Operace založené na Object vstupních datových typech boxu, které je mají převést na Object data určené pro výstup a rozbalit je. Boxing and unboxing reduce performance.

    Typy založené na Object tom jsou také opožděně vázané, což znamená, že přístup k jejich členům vyžaduje za běhu další kód. To také snižuje 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, lze 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í IComparable rozhraní, 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 účely řazení nebo kolace, 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 kostru definice 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í sestavit třídu z itemManager poskytnutí typu, 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ím typem nebo musí být typ hodnoty.

Pokud potřebujete vynutit více než jeden požadavek, použijte seznam omezení oddělený čárkami uvnitř složených závorek ({ }). Chcete-li vyžadovat přístupný konstruktor, zahrnete do seznamu klíčové slovo Nový operátor . Chcete-li vyžadovat typ odkazu, zahrnete Class klíčové slovo. Chcete-li vyžadovat typ hodnoty, zahrnete Structure klíčové slovo.

Další informace o omezeních najdete v tématu Seznam typů.

Příklad více 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 jak IComparableIDisposable rozhraní, být referenční typ 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 je zástupný symbol pro datový typ, který zadáte při deklaraci typu.

  • Zadejte argument. 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 musel implementovat konkrétní rozhraní, být nebo dědit z konkrétní třídy, mít přístupný konstruktor bez parametrů nebo být odkaz typu nebo typ hodnoty. Tato omezení můžete kombinovat, ale můžete zadat maximálně jednu třídu.

  • Vytvořený typ. Třída, struktura, rozhraní, procedura nebo delegát deklarovaná z obecného typu zadáním argumentů typu pro jeho parametry typu.

Viz také