Een van de vernieuwingen sinds C# 2.0 is de mogelijkheid om met generics te werken. De term generic betekent geparameteriseerde types. Door het gebruik van generics kan je klassen, interfaces en methoden maken die op een type-safe manier werken met verschillende datatypes. Met generics kan je een algoritme één keer ontwerpen en gebruiken voor verschillende gegevenstypes.
In dit eerste eenvoudig voorbeeld maken we een consoletoepassing die het gebruik van generics demonstreert.
using System;
using System.Collections.Generic;
using System.Text;
namespace MyGenerics
{
// Een eenvoudige generic klasse
using System;
/* *****************************************
* In de klasse Gen is T een type-parameter
* die zal vervangen worden door een echt type
* wanneer een object van het type Gen wordt
* gemaakt
* ******************************************/
public class Gen<T>
{
T ob; // declareert een object van het type T
// de constructor heeft een parameter van het type T
public Gen(T o)
{
ob = o;
}
// Retourneer ob, van het type T
public T getob()
{
return ob;
}
// Toon het type van T
public void showType()
{
Console.WriteLine("Type van T is " + typeof(T));
}
}
}
using System; using System.Collections.Generic; using System.Text; using MyGenerics; namespace eenvoudigvoorbeeld { class Program { static void Main(string[] args) { // We maken een object van de klasse Gen met type int Gen<int> iOb; // Maak een Gen<int> object en stel de referentie in op iOb iOb = new Gen<int>(102); // Toon type van iOb Console.WriteLine(iOb.GetType()); // Toon het type van data in iOb iOb.showType(); // Toon de waarde van iOb int v = iOb.getob(); Console.WriteLine("waarde: " + v +"\n\n"); // Maak een Gen object, type string Gen<string> strOb = new Gen<string>("Werken met Generics"); // Toon het datatype van strOb Console.WriteLine(strOb.GetType()); // Toon het datatype gestockeerd in strOb strOb.showType(); // Toon de waarde van strOb string str = strOb.getob(); Console.WriteLine("waarde: " + str +"\n\n"); } } }
Bespreking:
public class Gen<T>
{
...
}
Hier is T de naam van een typeparameter: deze naam wordt gebruikt als plaatshouder van het echte gegevenstype dat zal worden opgegeven wanneer een object wordt aangemaakt. Binnen de klasse Gen wordt T telkens gebruikt wanneer dit gegevenstype wordt aangegeven. Het declareren van een typeparameter gebeurt tussen < en >. Doordat de klasse Gen een typeparameter gebruikt spreken we van een Generic Class.
Het gebruik van de letter T is louter volgens conventie om als eerste typeparameter T te gebruiken, je mag gerust een andere letter of zelfs een meer beschrijvend woord gebruiken.
T ob;
public Gen(T o)
{
ob = o;
}
public Gen() { }
Gen<int> iOb;
iOb = new Gen<int>(102);
iOb = new Gen<double>(118.12); // Error!
iOb = strOb; //Error!
public class TweeGen<T, V>
{
T ob1;
V ob2;
public TweeGen(T o1, V o2)
{
ob1 = o1;
ob2 = o2;
}
public void showTypes()
{
Console.WriteLine("Type van T is " + typeof(T));
Console.WriteLine("Type van V is " + typeof(V));
}
public T getob1()
{
return ob1;
}
public V getob2()
{
return ob2;
}
}
static void Main(string[] args)
{
TweeGen<int, string> tgObj =
new TweeGen<int, string>(119, "Alpha Beta Gamma");
// Toon objecttype
Console.WriteLine(tgObj.GetType());
// Toon types van typeparameters
tgObj.showTypes();
// toon waarden
int v = tgObj.getob1();
Console.WriteLine("waarde: " + v);
string str = tgObj.getob2();
Console.WriteLine("waarde: " + str);
}
Opmerking: het is niet omdat je in de klasse TweeGen twee verschillende typeparameters T en V gebruikt dat je verplicht bent verschillende gegevenstypes te gebruiken:
TweeGen<int, int> tgObj =
new TweeGen<int, int>(119, 12);
class klassenaam<typeparameterlijst>
{
...
}
klassenaam<typeargumentlijst> variabelenaam =
new klassenaam<typeargumentlijst>(constructorargumentlijst);
Soms is het nuttig om de mogelijke types te beperken.
Dit kan je doen door constraints op te geven aan de typeparameters:
class klassenaam<typeparameterlijst> where typeparameter : constraints
{
...
}
class Test<T> where T : A
Gen.cs public class A { public void Hallo() { Console.WriteLine("Hallo"); } } // Klasse B erft over van A public class B : A { } // Klasse C erft niet over van A public class C { } // Generische klasse Test public class Test<T> where T : A { T obj; public Test(T o) { obj = o; } public void ZegHallo() { // Ok om de methode Hallo aan te roepen // aangezien T overerft van A obj.Hallo(); } }
A a = new A(); B b = new B(); C c = new C(); // Geldig daar A de basisklasse is Test<A> t1 = new Test<A>(a); t1.ZegHallo(); // Geldig daar B overerft van A Test<B> t2 = new Test<B>(b); t2.ZegHallo(); // Ongeldig daar C niet overerft van A // Test<C> t3 = new Test<C>(c); // Error!
| Meer tutorials: |
| leer ook: | html | | xhtml | | css | | asp | | asp.net | | c# | | ado.net | | linq | | ajax | | java | | javascript |