public class GenericList<T>
{
void Add(T input) { }
}
class TestGenericList
{
private class ExampleClass { }
static void Main()
{
// Declare a list of type int.
GenericList<int> list1 = new GenericList<int>();
// Declare a list of type string.
GenericList<string> list2 = new GenericList<string>();
// Declare a list of type ExampleClass.
GenericList<ExampleClass> list3 = new GenericList<ExampleClass>();
}
}
Month: February 2011
The overriding method cannot change the inherited constraints.
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();
}
}
Overriding a virtual method in a generic class
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());
}
}
A non-generic class can be the base class of a generic derived class
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());
}
}
A derived class with its own type parameters
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());
}
}
Template Method Pattern
using System;
public abstract class Calculate {
public abstract void PositionLabel();
public void SetupCalculate() {
this.PositionLabel();
}
public Calculate() {}
}
public class CalculateDeluxe : Calculate {
public override void PositionLabel() {
Console.WriteLine("Deluxe clock");
}
public CalculateDeluxe() { ;}
}
public class CalculateStandard : Calculate {
public override void PositionLabel() {}
public CalculateStandard() {}
}
class Client {
static void Main(string[] args) {
Calculate delCalculate = new CalculateDeluxe();
delCalculate.SetupCalculate();
Calculate stdCalculate = new CalculateStandard();
stdCalculate.SetupCalculate();
}
}
Strategy Pattern Demo
using System;
public abstract class Strategy {
public abstract void CreditBusinessRule();
public Strategy() { ;}
}
public class AStrategy : Strategy {
public override void CreditBusinessRule() {
Console.WriteLine("A");
}
public AStrategy() { ;}
}
public class BStrategy : Strategy {
public override void CreditBusinessRule() {
Console.WriteLine("Manager");
}
public BStrategy() { }
}
public class MyContext {
Strategy aStrategy;
public MyContext(Strategy crStrategy) {
this.aStrategy = crStrategy;
}
public void BusinessRule() {
this.aStrategy.CreditBusinessRule();
}
}
class Client {
static void Main(string[] args) {
MyContext cr = new MyContext(new AStrategy());
cr.BusinessRule();
}
}

