Csharp/CSharp Tutorial/Generic/Interface constraint

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

Use an interface constraint

<source lang="csharp">using System;

class NotFoundException : ApplicationException { }

public interface IUserID {

 string Number { 
   get; 
   set; 
 } 

 string Name { 
   get; 
   set; 
 } 

}

class Engineer : IUserID {

 string name; 
 string number; 

 public Engineer(string n, string num) { 
   name = n; 
   number = num; 
 } 

 // Implement IUserID 
 public string Number { 
   get { return number; } 
   set { number = value; } 
 } 

 public string Name { 
   get { return name; } 
   set { name = value; } 
 } 

}

class Manager : IUserID {

 string name; 
 string number; 

 public Manager(string n, string num) { 
   name = n; 
   number = num; 
 } 

 // Implement IUserID 
 public string Number { 
   get { return number; } 
   set { number = value; } 
 } 

 public string Name { 
   get { return name; } 
   set { name = value; } 
 } 

}

class Guest {

}

class IDList<T> where T : IUserID {

 T[] idList; 
 int end; 

 public IDList() {  
   idList = new T[10]; 
   end = 0; 
 } 

 public bool add(T newEntry) { 
   if(end == 10) 
      return false; 

   idList[end] = newEntry; 
   end++; 

   return true; 
 } 

 public T findByName(string name) { 

   for(int i=0; i<end; i++) { 
     if(idList[i].Name == name)  
       return idList[i]; 
   } 
   throw new NotFoundException(); 
 } 

 public T findByNumber(string number) { 
   for(int i=0; i<end; i++) { 
     if(idList[i].Number == number)  
       return idList[i]; 
   } 
   throw new NotFoundException(); 
 } 

}

class MainClass {

 public static void Main() { 
   IDList<Engineer> plist = new IDList<Engineer>(); 
   plist.add(new Engineer("T", "1")); 
   plist.add(new Engineer("G", "6")); 
   plist.add(new Engineer("M", "9")); 

   try { 
     Engineer frnd = plist.findByName("G"); 
     Console.Write(frnd.Name + ": " + frnd.Number); 
   } catch(NotFoundException) { 
     Console.WriteLine("Not Found"); 
   } 

   Console.WriteLine(); 

   IDList<Manager> plist2 = new IDList<Manager>(); 
   plist2.add(new Manager("H", "8")); 
   plist2.add(new Manager("C", "2")); 
   plist2.add(new Manager("N", "4")); 

   try { 
     Manager sp = plist2.findByNumber("4"); 
     Console.WriteLine(sp.Name + ": " + sp.Number); 
   } catch(NotFoundException) { 
       Console.WriteLine("Not Found"); 
   } 

   // The following declaration is invalid 
   // because Guest does NOT implement IUserID. 
   // IDList<Guest> plist3 = new IDList<Guest>(); // Error! 
 } 

}</source>

G: 6
N: 4