位置:首頁 > 軟件操作教程 > 編程開發(fā) > C# > 問題詳情

C# 從泛型類中繼承

提問人:劉團(tuán)圓發(fā)布時(shí)間:2020-12-08

    上例中的Farm<T>類以及本章前面介紹的其他幾個(gè)類都繼承自一個(gè)泛型類型。在Farni<T>中,這個(gè)類型是一個(gè)接口IEnumerable<T>。這里Farm<T>在T上提供的約束也會(huì)在IEnumerable<T>中使用的T上添加一個(gè)額外的約束。這可以用于限制未約束的類型,但需要遵循一些規(guī)則。

    首先,如果某個(gè)類型所繼承的基類型中受到了約束,該類型就不能“解除約束”。也就是說,類型丁在所繼承的基類型中使明時(shí),該類型必須受到至少與基類型相同的約束。例如,下面的代碼是正確的:

    class SuperFarm<T> : Farm<T> 

        where T : SuperCow {}

因?yàn)門在Farrn<T>中被約束為Animal,把它約束為SuperCow,就是把T約束為這些值的一個(gè)子集,所以這是可行的。但是,以下代碼不會(huì)編譯:

    class SuperFarm<T> : Farm<T>

        where T : struct{}

可以肯定地講,提供給SuperFarm<T>的類型T不能轉(zhuǎn)換為可由Farm<T>使用的T,所以代碼無法編譯。甚至對(duì)于約束為超集的情況,也會(huì)出現(xiàn)相同的問題:

class SuperFarm<T> : Farm<T>

    where T : class{}

即使SuperFarm<T>允許存在像Animal這樣的類型,F(xiàn)arm<T>中也不允許有滿足類約束的其他類型。否則編譯就會(huì)失敗。

另外,如果繼承自一個(gè)泛型類型,就必須提供所有必需的類型信息,這可以使用其他泛型類型參數(shù)的形式來提供,如上所述,也可以顯式提供。這也適用于繼承了泛型類型的非泛型類。例如:

    public class Cards : List<Card>, ICloneable{}

這是可行的,但下面的代碼會(huì)失?。?/p>

    public class Cards : List<T>, ICloneable{}

因?yàn)闆]有提供T的信息,所以無法編譯。

繼續(xù)查找其他問題的答案?

相關(guān)視頻回答
回復(fù)(0)
返回頂部