或构造函数约束:
public class BaseClass where T : new() { public T SomeMethod() { return new T(); } } public class SubClass : BaseClass where T : new() {...}
基类可以定义其签名使用一般类型参数的虚拟方法。在重写它们时,子类必须在方法签名中提供相应的类型:
public class BaseClass { public virtual T SomeMethod() {...} } public class SubClass: BaseClass { public override int SomeMethod() {...} }
如果该子类是一般类型,则它还可以在重写时使用它自己的一般类型参数:
public class SubClass: BaseClass { public override T SomeMethod() {...} }
您可以定义一般接口、一般抽象类,甚至一般抽象方法。这些类型的行为像其他任何一般基类型一样:
public interface ISomeInterface { T SomeMethod(T t); } public abstract class BaseClass { public abstract T SomeMethod(T t); }
public class SubClass : BaseClass { public override T SomeMethod(T t) {...) }
一般抽象方法和一般接口有一种有趣的用法。在 C# 2.0 中,不能对一般类型参数使用诸如 + 或 += 之类的运算符。例如,以下代码无法编译,因为 C# 2.0 不具有运算符约束:
public class Calculator { public T Add(T arg1,T arg2) { return arg1 + arg2;//Does not compile } //Rest of the methods }
但是,您可以通过定义一般操作,使用抽象方法(最好使用接口)进行补偿。由于抽象方法的内部不能具有任何代码,因此可以在基类级别指定一般操作,并且在子类级别提供具体的类型和实现:
public abstract class BaseCalculator { public abstract T Add(T arg1,T arg2); public abstract T Subtract(T arg1,T arg2); public abstract T Divide(T arg1,T arg2); public abstract T Multiply(T arg1,T arg2); } public class MyCalculator : BaseCalculator { public override int Add(int arg1, int arg2) { return arg1 + arg2; } //Rest of the methods }
|