写点什么

未来的 C#之覆写放宽

  • 2017-05-02
  • 本文字数:1259 字

    阅读完需:约 4 分钟

能使用协变(covariant)返回类型,这是一个在.NET 中常被请求到的特性。例如,可以使用“override Widget Clone()”覆写“virtual object Clone()”。从类型安全的角度看,这种做法完全可以接受,但是当前并不被 C#所允许。

根据“对协变返回类型的建议”,该规则将被放宽,使得相比于基类中的方法,子类中的同一方法可以返回更具体的类型。除了上例中给出的 Clone 方法之外,这种放宽对抽象工厂和其他框架代码也会十分有用。

隐式投影(Implicit Shadowing) 在 C#中,一种可能的实现方法是发射(Emit)两个函数。还以 Clone 方法为例,我们可以在中间语言(IL)中看到如下的方法签名(Method Signature):

复制代码
override object Clonable.Clone()
public new Widget Clone()

按 HaloFour 的说法,这是可以工作的,原因在于:

在通用语言运行库(CLR,Common Language Runtime)规范中,看上去的确允许覆写具有不同的名字,并可以具有不同的可见性(Visibility)。

[…]

通过在 IL 中显式地使用“.override”语句,我能解决所有的重载决议(Overload Resolution)问题,并能使用具有不同可见性和名字的方法进行覆写。

该编译器特性可与现有的 CLR 版本无缝工作,并且旧版本的 VB 或 C#将可以毫无问题地消费这样的类。

但是这一做法也存在着一些限制。首先,从覆写方法正常继承而来的属性是不能被拷贝到隐藏(New)方法中的。从技术上讲,编译器可以拷贝基类属性到隐藏方法上。但是这种做法存在着问题,一旦添加隐藏属性添加到基类方法,就将需要对子类进行重编译。

其次,这也会导致在使用反射(Reflection)时,难以看到隐藏方法与被覆写的基类方法之间的关联。

最后一点,这会对通过基类接口的调用方法产生性能上的影响。但是,该问题可以通过尾调用(Tail Call)及其他优化技术缓解。

属性

在 C#中,另一种可能的实现方法是使用新属性。如果编译器能识别该属性,则会针对更具体的类型自动添加强制转换(Cast)。

该方法的一个缺点在于,如果新属性不能被语言所理解,就不能使用该方法。当然,新属性也必须添加到基础类库(BLC,Base Class Library)中,这意味着它不会在所有的平台上立刻可用。

另一个缺点是,它可能会在处理结构体时引入不必要的装箱(Boxing)操作。继续以上面的 Clone 方法为例,编译器将必须装箱一个 WidgerStruct 结构体,然后立刻将其强制转换为一个正常的 WidgetStruct 结构体。

投影和覆写的放宽

另一种替代做法是放宽对投影的限制规则。当前,一个方法是不允许同时被投影和覆写的。但是,考虑到 CLR 是支持这种做法的,C#只是允许显式地编写如下代码:

复制代码
class Widget : Cloneable
{
public override Cloneable Clone()
{
return this.Clone();
}
public new Widget Clone()
{
return [...];
}
}

根据隐式投影的建议,这将依赖编译器去重命名重载方法。

时间表

需要指出的是,大部分该特性相关的讨论出现于 2015 年上半年,即两年之前。但是该建议是在今年二月份才正式写完,因此尚未采取任何行动,或者说尚未公开采取任何行动。

查看英文原文: C# Futures: Relaxed Overrides

2017-05-02 19:001477
用户头像

发布了 227 篇内容, 共 74.8 次阅读, 收获喜欢 28 次。

关注

评论

发布
暂无评论
发现更多内容

诚迈科技董事长王继平赴国创中心交流车用操作系统合作事宜

科技热闻

2022年京东读书年度之书,获评读者最喜爱互联网+的就是……

博文视点Broadview

OCR在转转游戏的应用

转转技术团队

后端

华为云低代码技术:让矿区管理“智变”,一览无遗

科技怪授

干货 | 如何进行CMDB数据运营?

嘉为蓝鲸

数据运营 CMDB 自动化运维 嘉为蓝鲸

数字化时代,校园生活还可以这样过

华为云开发者联盟

数据库 后端 华为云 12 月 PK 榜

百家号奇妙未来季创作大赛落幕!AIGC开启内容创作新征程

科技热闻

前端程序员培训学习后的就业前景怎么样

小谷哥

哪些java培训中心比较靠谱?

小谷哥

零基础3Dmax入门教程

Finovy Cloud

软件 3DMAX

Python图像处理丨详解图像去雾处理方法

华为云开发者联盟

Python 人工智能 华为云 12 月 PK 榜

融云获 51CTO 年终评选「中国 IT 行业政企数智办公优秀解决方案奖」

融云 RongCloud

IT 数智化 51cto

图查询语言 nGQL 简明教程 vol.01 快速入门

NebulaGraph

图数据库

掌握这5大功能,解锁鲲鹏开发新发现

华为云开发者联盟

开发 华为云 12 月 PK 榜

MASA MAUI Plugin (七)应用通知角标(小红点)Android+iOS

MASA技术团队

blazor MASA MAUI MASA Blazor

前端程序员培训学习有哪些攻略

小谷哥

深度学习入门篇 | 常用的经典神经网络模型

九章云极DataCanvas

神经网络 深度学习

大数据程序员培训机构怎么选

小谷哥

“云-网-边-端”融合,汽车新势力的DevOps建设

嘉为蓝鲸

DevOps 自动化运维 嘉为蓝鲸

和鲸科技入选 2022 中国数据智能领域最具商业潜力的科技 Cool Vender丨甲子20 榜单

ModelWhale

数字化转型 数据智能 科技企业 榜单

运维工作汇报那天,集团领导过来视察...

嘉为蓝鲸

自动化运维 嘉为蓝鲸

说透IO多路复用模型

C++后台开发

socket linux开发 epoll IO多路复用 C++开发

上云节省 35%计算资源,420 个运维人天:运满满实时计算实践和思考

Apache Flink

大数据 flink 实时计算

BitSail“拍了拍”你,并给你一份快速入门指南

字节跳动数据平台

开源 数据引擎 12 月 PK 榜

java编程培训怎么学习?

小谷哥

转转支付网关之注解式HTTP客户端

转转技术团队

后端 Java、 注解 http client

使用 ClusterResourceSet 为 Cluster API 集群自动安装 CNI 插件

Se7en

华为云助推武水集团项目成功入选住建部“智慧水务”典型案例!

华为云开发者联盟

云计算 后端 华为云 12 月 PK 榜

火山引擎DataTester:如何做A/B实验的假设检验

字节跳动数据平台

大数据 AB testing实战 12 月 PK 榜

一家可靠的HDI板厂,需要具备哪些基本条件?

华秋PCB

生产 工艺 PCB PCB电路板

阿里妈妈内容风控模型预估引擎的探索和建设

阿里技术

风控模型

未来的C#之覆写放宽_.NET_Jonathan Allen_InfoQ精选文章