Csharp/CSharp Tutorial/Generic/Base class constaint
A more practical demonstration of a base class constraint
using System;
class NotFoundException : ApplicationException {}
class UserID {
string name;
string number;
public UserID(string n, string num) {
name = n;
number = num;
}
public string Number {
get { return number; }
set { number = value; }
}
public string Name {
get { return name; }
set { name = value; }
}
}
class Employee : UserID {
public Employee(string n, string num) : base(n, num)
{
}
}
class Manager : UserID {
public Manager(string n, string num) :
base(n, num) { }
}
class Guest {
}
class IDList<T> where T : UserID {
T[] userIDList;
int end;
public IDList() {
userIDList = new T[10];
end = 0;
}
public bool add(T newEntry) {
if(end == 10) return false;
userIDList[end] = newEntry;
end++;
return true;
}
public T findByName(string name) {
for(int i=0; i<end; i++) {
if(userIDList[i].Name == name)
return userIDList[i];
}
throw new NotFoundException();
}
public T findByNumber(string number) {
for(int i=0; i<end; i++) {
if(userIDList[i].Number == number)
return userIDList[i];
}
throw new NotFoundException();
}
}
class MainClass {
public static void Main() {
IDList<Employee> plist = new IDList<Employee>();
plist.add(new Employee("T", "1"));
plist.add(new Employee("G", "6"));
plist.add(new Employee("M", "5"));
try {
Employee frnd = plist.findByName("T");
Console.Write(frnd.Name + ": " + frnd.Number);
} catch(NotFoundException) {
Console.WriteLine("Not Found");
}
Console.WriteLine();
IDList<Manager> plist2 = new IDList<Manager>();
plist2.add(new Manager("G", "8"));
plist2.add(new Manager("C", "9"));
plist2.add(new Manager("N", "2"));
try {
Manager sp = plist2.findByNumber("8");
Console.WriteLine(sp.Name + ": " + sp.Number);
} catch(NotFoundException) {
Console.WriteLine("Not Found");
}
}
}
T: 1 G: 8
A simple demonstration of a base class constraint.
Because of the base class constraint, all type arguments passed to Test must have A as a base class.
using System;
class A {
public void hello() {
Console.WriteLine("Hello");
}
}
class B : A { }
class C { }
class Test<T> where T : A {
T obj;
public Test(T o) {
obj = o;
}
public void sayHello() {
obj.hello();
}
}
class MainClass {
public static void Main() {
A a = new A();
B b = new B();
C c = new C();
Test<A> t1 = new Test<A>(a);
t1.sayHello();
Test<B> t2 = new Test<B>(b);
t2.sayHello();
// The following is invalid because
// C does not inherit A.
// Test<C> t3 = new Test<C>(c); // Error!
}
}
Hello Hello