A derived class can add its own type parameters
using System;
class Gen<T> {
T ob;
public Gen(T o) {
ob = o;
}
public T getob() {
return ob;
}
}
class Gen2<T, V> : Gen<T> {
V ob2;
public Gen2(T o, V o2) : base(o) {
ob2 = o2;
}
public V getob2() {
return ob2;
}
}
class MainClass {
public static void Main() {
Gen2<string, int> x = new Gen2<string, int>("Value is: ", 99);
Console.Write(x.getob());
Console.WriteLine(x.getob2());
}
}
Value is: 99
A nongeneric class can be the base class of a generic derived class
using System;
class NonGen {
int num;
public NonGen(int i) {
num = i;
}
public int getnum() {
return num;
}
}
class Gen<T> : NonGen {
T ob;
public Gen(T o, int i) : base (i) {
ob = o;
}
public T getob() {
return ob;
}
}
class MainClass {
public static void Main() {
Gen<String> w = new Gen<String>("Hello", 4);
Console.Write(w.getob() + " ");
Console.WriteLine(w.getnum());
}
}
Hello 4
A simple generic class hierarchy
using System;
class Gen<T> {
T ob;
public Gen(T o) {
ob = o;
}
public T getob() {
return ob;
}
}
class Gen2<T> : Gen<T> {
public Gen2(T o) : base(o) {
}
}
class MainClass {
public static void Main() {
Gen2<string> g2 = new Gen2<string>("Hello");
Console.WriteLine(g2.getob());
}
}
Hello
Overriding a virtual method in a generic class
using System;
class Gen<T> {
protected T ob;
public Gen(T o) {
ob = o;
}
public virtual T getob() {
Console.Write("Gen"s getob(): " );
return ob;
}
}
class Gen2<T> : Gen<T> {
public Gen2(T o) : base(o) { }
public override T getob() {
Console.Write("Gen2"s getob(): ");
return ob;
}
}
class MainClass {
public static void Main() {
Gen<int> iOb = new Gen<int>(88);
Console.WriteLine(iOb.getob());
iOb = new Gen2<int>(99);
Console.WriteLine(iOb.getob());
}
}
Gen"s getob(): 88
Gen2"s getob(): 99