• 从泛型类中继承


    上面示例中的Farm<T>类以及本章前面介绍的其他几个类都继承自一个泛型类型。

    在Farm<T>中,这个类型是一个接口IEnumerable<T>。

    这里Farm<T>在T上提供的约束也会在IEnumerable<T>中使用的T上添加一个额外的约束。

    这可以用于限制未约束的类型,但是需要遵循一些规则。

    首先,如果某个类型在它所继承的基类型中受到了约束,该类型就不能“解除约束”。

    也就是说,类型T在所继承的基类型中使用时,该类型必须受到至少与基类型相同的约束。

    例如,下面的代码是正确的

    class SuperFarm<T>:Farm<T>

            where T:SuperCow

    {

    }

    因为T在Farm<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的信息,所以不能编译

    注意:

    如果给泛型类型提供了参数,例如,上面的List<Card>,就可以把类型引用为"关闭"。

    同样,继承List<T>,就是继承一个"打开"的泛型类型。

  • 相关阅读:
    当前流行的智能硬件产品整理
    一个桌面视频录制利器推荐--Snagit
    微信支付---退款的坑
    微信支付退款证书服务器配置
    Git安装和TortoiseGit详细使用教程【基础篇】
    通俗易懂,什么是.NET Core以及.NET Core能做什么
    向ASP.NET Core迁移
    SQLServer 查看SQL语句的执行时间
    SqlServer 2014 Enterprise 企业版下载与安装教程(附图片)
    SQL Server表分区
  • 原文地址:https://www.cnblogs.com/chucklu/p/4451651.html
Copyright © 2020-2023  润新知