Megjegyzés
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhat bejelentkezni vagy módosítani a címtárat.
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhatja módosítani a címtárat.
Az általános típusú egyetlen programozási elem, amely több adattípus esetében is ugyanazt a funkciót látja el. Általános osztály vagy eljárás definiálásakor nem kell külön verziót meghatároznia minden olyan adattípushoz, amelynek ezt a funkciót el szeretné végezni.
A hasonlat egy cserélhető fejekkel rendelkező csavarhúzó készlet. Vizsgálja meg a csavart, és válassza ki a megfelelő típusú fejét a csavarhoz (lapos, kereszthornyos, csillag). Miután beszúrta a megfelelő fejet a csavarhúzó fogantyúba, pontosan ugyanazt a funkciót hajtja végre a csavarhúzóval, nevezetesen a csavar elfordításával.
Általános típus definiálásakor egy vagy több adattípussal paraméterezi azt. A típusparaméterek lehetővé teszik, hogy a kód az adattípusokat a kóddal szembeni igényekhez igazítsa. A kód több különböző programozási elemet deklarálhat az általános elemtől, amelyek mindegyike különböző adattípusokon működik. A deklarált elemek azonban mind azonos logikát hajtanak végre, függetlenül attól, hogy milyen adattípusokat használnak.
Előfordulhat például, hogy egy adott adattípuson (például String) működő üzenetsorosztályt szeretne létrehozni és használni. Az alábbi példa bemutatja, hogyan deklarálhat egy ilyen osztályt System.Collections.Generic.Queue<T>-tól kezdve.
Public stringQ As New System.Collections.Generic.Queue(Of String)
Mostantól a stringQ használatával kizárólag String értékekkel dolgozhat. Mivel a stringQ a String-re jellemző, nem pedig a Object értékek általánosítására, nincs késői kötés vagy típusátalakítás. Az általános típusok időt takaríthatnak meg a végrehajtáshoz, és csökkenthetik a futásidejű hibákat.
Az általános típus használatáról további információt a Útmutató: Általános osztályhasználata című témakörben talál.
Példa egy általános osztályra
Az alábbi példa egy általános osztály csontvázdefinícióját mutatja be.
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
Az előző csontvázban a t egy típusú paraméter,, vagyis az osztály deklarálásakor megadott adattípus helyőrzője. A kód más részein deklarálhatja a classHolder különböző verzióit, ha különböző adattípusokat ad meg t. Az alábbi példa két ilyen deklarációt mutat be.
Public integerClass As New classHolder(Of Integer)
Friend stringClass As New classHolder(Of String)
Az előző utasítások létrehozott osztályokat deklarálnak, amelyekben egy adott típus lecseréli a típusparamétert. Ez a csere propagálása a kód egészében történik a létrehozott osztályon belül. Az alábbi példa bemutatja, hogyan néz ki a processNewItem eljárás a integerClass.
Public Sub processNewItem(ByVal newItem As Integer)
Dim tempItem As Integer
' Inserted code now processes an Integer item.
End Sub
Egy teljesebb példa: Útmutató: Olyan osztály definiálása, amely képes azonos funkciókat biztosítani a különböző adattípusokon.
Jogosult programozási elemek
Definiálhat és használhat általános osztályokat, struktúrákat, interfészeket, eljárásokat és meghatalmazottakat. A .NET számos általános osztályt, struktúrát és interfészt határoz meg, amelyek a gyakran használt általános elemeket jelölik. A System.Collections.Generic névtér szótárakat, listákat, üzenetsorokat és halmokat tartalmaz. Mielőtt meghatározná a saját általános elemet, ellenőrizze, hogy már elérhető-e a(z) System.Collections.Generic-ban.
Az eljárások nem típusok, de általános eljárásokat definiálhat és használhat. Lásd Visual Basicáltalános eljárásait.
Az általános típusok előnyei
Az általános típus számos különböző programozási elem deklarálásának alapjául szolgál, amelyek mindegyike egy adott adattípuson működik. Az általános típus alternatívái a következők:
- Egyetlen típus, amely a
Objectadattípuson működik. - A típus típusspecifikus verzióinak készlete. Minden verzió egyedileg kódolt és egy adott adattípuson működik, például
String,Integervagy felhasználó által definiált típuson, példáulcustomer.
Az általános típus az alábbi előnyökkel rendelkezik az alábbi alternatív megoldásokkal szemben:
- Típusbiztonság Az általános típusok kényszerítik a fordítási idő típusának ellenőrzését. A
Objectalapuló típusok bármilyen adattípust elfogadnak, és kódot kell írnia annak ellenőrzéséhez, hogy a bemeneti adattípus elfogadható-e. Általános típusok esetében a fordító a futtatás előtt észlelheti a típuseltéréseket. - Teljesítmény. Az általános típusoknak nem kell dobozolni a adatokat és kicsomagolni a adatokat, mert mindegyik egy adattípusra van specializálva. A(z)
Object-ra alapuló műveleteknek a beviteli adattípusokat csomagolniuk kell, hogyObject-re alakítsák őket, és a kimenetre szánt adatokat kicsomagolják. A dobozolás és a kicsomagolás csökkenti a teljesítményt. AObject-ra alapuló típusok is késői kötésűek, ami azt jelenti, hogy tagjaik elérése futásidőben extra kódot igényel. A típuskonverziók szintén csökkentik a teljesítményt. - Kódkonszolidáció. Az általános típusú kódot csak egyszer kell definiálni. Egy típus típusspecifikus verzióinak minden verzióban ugyanazt a kódot kell replikálnia, az egyetlen különbség az adott verzióhoz tartozó adattípus. Általános típusok esetén a típusspecifikus verziók mindegyike az eredeti általános típusból jön létre.
- Kód újrafelhasználása. Az adott adattípustól nem függő kód különböző adattípusokkal újra felhasználható, ha általános. Gyakran újra felhasználhatja olyan adattípussal is, amelyet eredetileg nem jósolta meg.
- IDE-támogatás. Ha egy általános típusból deklarált épített típust használ, az integrált fejlesztési környezet (IDE) további támogatást nyújt a kód fejlesztése során. Az IntelliSense például megjelenítheti egy konstruktor vagy metódus argumentumának típusspecifikus beállításait.
- Általános algoritmusok. A típusfüggetlen absztrakt algoritmusok jó jelöltek általános típusokhoz. Az elemeket a IComparable interfész használatával rendező általános eljárás például bármely olyan adattípussal használható, amely IComparableimplementál.
Korlátok
Bár az általános típusdefinícióban szereplő kódnak a lehető legtípusfüggetlennek kell lennie, szükség lehet az általános típushoz megadott adattípusok bizonyos képességére. Ha például két elemet szeretne összehasonlítani a rendezéshez vagy a csoportosításhoz, az adattípusnak implementálnia kell a IComparable felületet. Ezt a követelményt úgy kényszerítheti ki, hogy hozzáad egy kényszert a típusparaméterhez.
A példa a kényszerre
Az alábbi példa egy olyan korlátozással rendelkező osztály csontvázdefinícióját mutatja be, amely megköveteli a típusargumentumot a IComparableimplementálásához.
Public Class itemManager(Of t As IComparable)
' Insert code that defines class members.
End Class
Ha a következő kód megpróbál létrehozni egy osztályt a itemManager-ból olyan típus megadásával, amely nem implementálja a IComparable-et, a fordító hibát jelez.
A kényszerek típusai
A kényszer bármilyen kombinációban megadhatja a következő követelményeket:
- A típusargumentumnak egy vagy több illesztőt kell implementálnia
- A típusargumentumnak legfeljebb egy osztály típusának vagy öröklésének kell lennie
- A típusargumentumnak el kell érnie egy paraméter nélküli konstruktort, amely elérhető az objektumokat létrehozó kód számára.
- A típusargumentumnak hivatkozástípusnakkell lennie, vagy értéktípusnak kell lennie
A C#-kód deklarálhatja, hogy egy típusargumentumnak nem felügyelt típusúkell lennie. A Visual Basic kényszeríti ezt a korlátozást az olyan Visual Basic-kód esetében, amely egy általános típust vagy metódust használ, amelyet ezzel a korlátozással definiáltak (C#-ban). A Visual Basicben azonban nem deklarálhat unmanaged korlátozást egy típusparaméterre.
Ha egynél több követelményt kell előírnia, vesszővel elválasztott kényszerlistát kell használnia, kapcsos zárójelek között ({ }). Akadálymentes konstruktor megköveteléséhez az Új operátor kulcsszót kell szerepeltetnie a listában. Hivatkozástípus megköveteléséhez adja meg a Class kulcsszót; értéktípus megköveteléséhez a Structure kulcsszót kell megadnia.
További információ a korlátozásokról: Típuslista.
Példa több korlátozásra
Az alábbi példa egy általános osztály csontvázdefinícióját mutatja be a típusparaméter kényszerlistájával. Az osztály egy példányát létrehozó kódban a típusargumentumnak implementálnia kell a IComparable és IDisposable interfészeket, referenciatípusnak kell lennie, és el kellérhetővé tennie egy elérhető paraméter nélküli konstruktort.
Public Class thisClass(Of t As {IComparable, IDisposable, Class, New})
' Insert code that defines class members.
End Class
Fontos kifejezések
Az általános típusok a következő kifejezéseket vezetik be és használják:
- Általános típus. Egy osztály, struktúra, felület, eljárás vagy meghatalmazott definíciója, amelyhez deklaráláskor legalább egy adattípust megad.
- típusparaméter. Egy általános típusdefinícióban a típus deklarálásakor megadott adattípus helyőrzője.
- Típus argumentum. Egy adott adattípus, amely egy típusparamétert vált fel, amikor egy általános típusból deklarál egy konstruktált típust.
- kényszer. A típusparaméter azon feltétele, amely korlátozza a megadható típusargumentumot. A kényszer megkövetelheti, hogy a típusargumentum implementáljon egy adott felületet, örökölje egy adott osztálytól, legyen elérhető paraméter nélküli konstruktor, vagy legyen referenciatípus vagy értéktípus. Ezeket a korlátozásokat kombinálhatja, de legfeljebb egy alaposztályt adhat meg.
- Konstruált típus. Általános típusból deklarált osztály, struktúra, interfész, eljárás vagy delegált, amelyet típusargumentumok megadásával hoztak létre a típusparamétereihez.