[英]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.