Csharp/CSharp Tutorial/Generic/Base class constaint
A more practical demonstration of a base class constraint
<source lang="csharp">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"); } }
}</source>
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.
<source lang="csharp">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 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!
}
}</source>
Hello Hello