[英]What's the point of having constraints for type parameters in .NET (base class and interface constraints)
我正在研究工作中的小型类库,它自然会涉及使用泛型来完成这项任务。 但是有些东西我对泛型并不是很理解:为什么我需要使用泛型类型参数,然后将type参数约束到特定的基类或接口。
这是我的意思的一个例子:
public class MyGenericClass<T> where T : SomeBaseClass
{
private T data;
}
这是没有泛型的实现
public class MyClass
{
private SomeBaseClass data;
}
这两个定义是否相同(如果是,那么我在这里看不到使用泛型的优点)?
如果没有,我们在这里使用泛型有什么好处?
与仿制药的几乎所有用途一样,消费者也会受益。 约束类型可以获得与强类型参数相同的优势(或者您可以执行其他操作,例如确保存在无参数构造函数或确保它是值或引用类型),同时仍保留泛型的细节您的班级或职能的消费者。
例如,使用泛型也允许您获取指定的实际类型(如果具有任何特定值)。
这个例子有点人为,但看看这个:
public class BaseClass
{
public void FunctionYouNeed();
}
public class Derived : BaseClass
{
public void OtherFunction();
}
public class MyGenericClass<T> where T: BaseClass
{
public MyGenericClass(T wrappedValue)
{
WrappedValue = wrappedValue;
}
public T WrappedValue { get; set; }
public void Foo()
{
WrappedValue.FunctionYouNeed();
}
}
...
var MyGenericClass bar = new MyGenericClass<Derived>(new Derived());
bar.Foo();
bar.WrappedValue.OtherFunction();
不同之处在于前者将新类定义为特定类型; 后者只是定义了一个具有该类型字段的普通类。
这都是关于类型安全的。 使用泛型,您可以返回一个具体类型(T),而不是一些基类型,它定义了泛型类中所需的API。 因此,您的方法的调用者不必将结果强制转换为具体类型(这是一个容易出错的操作)。
主要区别在于使用方法。 在第一种情况下,用法可以包括:
MyGenericClass<SomeDerivedClass> Variable
Variable.data.SomeDerivedProperty = X
因此,当您使用该类时,您仍然可以从SomeDerivedClass访问任何内容而无需返回它。
第二个例子不允许这样做。
MyClass.data = SomeDerivedClassInstance
MyClass.data.SomeDerivedProperty = X //Compile Error
((SomeDerivedClass)MyClass.data).SomeDerivedProperty = X //Ewwwww
您将不得不强制转换为SomeDerivedClass(这是不安全的)以使用特定于派生类的内容。
我认为除了泛型版本限制你的类 ,而第二个只是对类成员的约束之外,存在巨大差异。 如果您向第一个类添加了更多成员和方法,那么您将拥有相同的约束。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.