在.NET中对类型参数进行约束的重点是什么(基类和接口约束)

时间:2012-04-30 13:20:44

标签: c# .net generics

我正在开发一个小型类库,它自然会涉及使用泛型来完成这项任务。但是有些东西我对仿制药并不是很了解: 为什么我需要使用泛型类型参数,然后将type参数约束到特定的基类或接口。

这是我的意思的一个例子:

public class MyGenericClass<T> where T : SomeBaseClass
{
    private T data;
}

这是没有泛型的实现

public class MyClass
{
    private SomeBaseClass data;
}

这两个定义是否相同(如果是,那么我在这里看不到使用泛型的优点)?

如果没有,我们在这里使用泛型有什么好处?

5 个答案:

答案 0 :(得分:7)

与几乎所有仿制药的使用一样,消费者受益。约束类型可以获得与强类型参数相同的优势(或者您可以执行其他操作,例如确保存在无参数构造函数或确保它是值或引用类型),同时仍保留泛型的细节您的班级或职能的消费者。

例如,使用泛型也可以获得指定的实际类型,如果它具有任何特定值。

这个例子有点人为,但看看这个:

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();

答案 1 :(得分:1)

不同之处在于前者将新类定义为特定类型;后者只是定义了一个带有该类型的字段的普通类。

答案 2 :(得分:1)

一切都与型号安全有关。使用泛型,您可以返回一个具体类型(T),而不是一些基类型,它定义了泛型类中所需的API。因此,您的方法的调用者不必将结果强制转换为具体类型(这是一个容易出错的操作)。

答案 3 :(得分:1)

主要区别在于使用方法。在第一种情况下,用法可以有:

MyGenericClass<SomeDerivedClass> Variable
Variable.data.SomeDerivedProperty = X

因此,当您使用该类时,您仍然可以从SomeDerivedClass访问任何内容而无需返回它。

第二个例子不允许这样做。

MyClass.data = SomeDerivedClassInstance
MyClass.data.SomeDerivedProperty = X //Compile Error
((SomeDerivedClass)MyClass.data).SomeDerivedProperty = X //Ewwwww

您必须转换回SomeDerivedClass(这是不安全的)才能使用特定于派生类的内容。

答案 4 :(得分:1)

除非通用版本限制您的,否则我认为存在巨大的差异,而第二种只是对成员的约束班上的。如果您向第一个类添加了更多成员和方法,那么您将拥有相同的约束。