Csharp/CSharp Tutorial/Generic/Base class constaint

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

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