位置:首页 > 软件操作教程 > 编程开发 > C# > 问题详情

C# 从泛型类中继承

提问人:刘团圆发布时间:2020-12-08

    上例中的Farm<T>类以及本章前面介绍的其他几个类都继承自一个泛型类型。在Farni<T>中,这个类型是一个接口IEnumerable<T>。这里Farm<T>在T上提供的约束也会在IEnumerable<T>中使用的T上添加一个额外的约束。这可以用于限制未约束的类型,但需要遵循一些规则。

    首先,如果某个类型所继承的基类型中受到了约束,该类型就不能“解除约束”。也就是说,类型丁在所继承的基类型中使明时,该类型必须受到至少与基类型相同的约束。例如,下面的代码是正确的:

    class SuperFarm<T> : Farm<T> 

        where T : SuperCow {}

因为T在Farrn<T>中被约束为Animal,把它约束为SuperCow,就是把T约束为这些值的一个子集,所以这是可行的。但是,以下代码不会编译:

    class SuperFarm<T> : Farm<T>

        where T : struct{}

可以肯定地讲,提供给SuperFarm<T>的类型T不能转换为可由Farm<T>使用的T,所以代码无法编译。甚至对于约束为超集的情况,也会出现相同的问题:

class SuperFarm<T> : Farm<T>

    where T : class{}

即使SuperFarm<T>允许存在像Animal这样的类型,Farm<T>中也不允许有满足类约束的其他类型。否则编译就会失败。

另外,如果继承自一个泛型类型,就必须提供所有必需的类型信息,这可以使用其他泛型类型参数的形式来提供,如上所述,也可以显式提供。这也适用于继承了泛型类型的非泛型类。例如:

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

这是可行的,但下面的代码会失败:

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

因为没有提供T的信息,所以无法编译。

继续查找其他问题的答案?

相关视频回答
回复(0)
返回顶部