Csharp/CSharp Tutorial/Generic/Base class constaint

Материал из .Net Framework эксперт
Перейти к: навигация, поиск

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