簡體   English   中英

在.NET中對類型參數進行約束有什么意義(基類和接口約束)

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM