从泛型类中继承
上面示例中的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>,就是继承一个"打开"的泛型类型。
作者:Chuck Lu GitHub |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了