Csharp/C Sharp/Generics/Generic Class Hierarchy

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

A derived class with its own type parameters

<source lang="csharp"> using System; class MyClass<T> {

 T ob;
 public MyClass(T o) {
   ob = o;
 }
 public T getob() {
   return ob;
 }

} class ClassA<T, V> : MyClass<T> {

 V ob2;
 public ClassA(T o, V o2) : base(o) {
   ob2 = o2;
 }
 public V getob2() {
   return ob2;
 }

} class Test {

 public static void Main() {
   ClassA<string, int> x = new ClassA<string, int>("Value is: ", 9);
   Console.Write(x.getob());
   Console.WriteLine(x.getob2());
 }

}

      </source>


A non-generic class can be the base class of a generic derived class

<source lang="csharp"> using System; class MyBaseClass {

 int num;
 public MyBaseClass(int i) {
   num = i;
 }
 public int getnum() {
   return num;
 }

} class MyGenericClass<T> : MyBaseClass {

 T ob;
 public MyGenericClass(T o, int i) : base (i) {
   ob = o;
 }
 public T getob() {
   return ob;
 }

} class HierDemo3 {

 public static void Main() {
   MyGenericClass<String> w = new MyGenericClass<String>("Hello", 7);
   Console.WriteLine(w.getob());
   Console.WriteLine(w.getnum());
 }

}

      </source>


A simple generic class hierarchy

<source lang="csharp"> using System; class GenericClass<T> {

 T myObject;
 public GenericClass(T o) {
   myObject = o;
 }
 public T getmyObject() {
   return myObject;
 }

} class GenericClass2<T> : GenericClass<T> {

 public GenericClass2(T o) : base(o) {
 }

} class Test {

 public static void Main() {
   GenericClass2<string> g2 = new GenericClass2<string>("www.nfex.ru");
   Console.WriteLine(g2.getmyObject());
 }

}

      </source>


Overriding a virtual method in a generic class

<source lang="csharp"> using System; class MyBaseGenericClass<T> {

 protected T myObject;
 public MyBaseGenericClass(T o) {
   myObject = o;
 }
 public virtual T getmyObject() {
   Console.Write("Base"s getmyObject(): " );
   return myObject;
 }

} class MyGenericClass<T> : MyBaseGenericClass<T> {

 public MyGenericClass(T o) : base(o) {  }
 public override T getmyObject() {
   Console.Write("overide getmyObject(): ");
   return myObject;
 }

} class Test {

 public static void Main() {
   MyBaseGenericClass<int> myObject = new MyBaseGenericClass<int>(8);
   Console.WriteLine(myObject.getmyObject());
   myObject = new MyGenericClass<int>(9);
   Console.WriteLine(myObject.getmyObject());
 }

}

      </source>


The overriding method cannot change the inherited constraints.

<source lang="csharp"> using System; public class MyClass {

   public virtual void MethodA<T>(T arg)
       where T : new() {
   }

} public class YClass : MyClass {

   public override void MethodA<T>(T arg) {
       T obj = new T();
   }

}

</source>