写点什么

未来的 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:001743
用户头像

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

关注

评论

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

老弟做了个网盘,炸了!

程序员鱼皮

Java c++ 系统设计 后端

SphereEx 登陆 ApacheCon Asia|依托 ShardingSphere 可插拔架构体系打造数据应用完整生态

SphereEx

数据库 开源

一周信创舆情观察(8.2~8.8)

统小信uos

MySQL 系列教程之(一)初识 MySQL

若尘

MySQL 8月日更

WICC 2021技术分论坛 融云解析全球一体化通信网络架构

融云 RongCloud

国家电网调控人工智能创新大赛开启 百度飞桨提供国产AI平台

百度大脑

人工智能 飞桨

学习笔记:HTTP消息的响应码

姬翔

北鲲云告诉你足够的存储空间在高性能计算有多重要

北鲲云

Compose 中的 ConstraintLayout

Changing Lin

8月日更

Debian 10 安装 phpMyAdmin

Tao

MySQL 服务器 PHP-FPM MariaDB Debian

🏆【SpringBoot 技术专题】「Tomcat技术专区」用正确的姿势如何用外置tomcat配置及运行(Tomcat优化分析)

码界西柚

tomcat springboot 8月日更

运维日志审计是什么意思?用什么工具好?

行云管家

信息安全 堡垒机 日志审计 运维日志 安全事故

七面阿里淘宝,工程项目经验为0,所以被死磕Java,最终拿p7职级

公众号_愿天堂没有BUG

Java 编程 程序员 架构 面试

疫情闭关期间,读完这些“Java技术栈”,拿下阿里Offer没问题

公众号_愿天堂没有BUG

Java 编程 程序员 架构 面试

融云为WICC2021“新视界”带来视频压缩技术新探索

融云 RongCloud

25岁阿里120W年薪架构师推荐学习的750页微服务架构深度解析文档

公众号_愿天堂没有BUG

Java 编程 程序员 架构 面试

美国黑帽网络安全大会:移动平台和开源软件正在成为网络安全关键威胁

BeeWorks

微步在线TDP:拯救被IDS折磨的安全人员

BeeWorks

数据应用的变与不变,ShardingSphere 正在影响未来数字体验的建设理念

SphereEx

数据库 开源

马士兵老师亲自总结3000+道Java面试题,刷完吊打架构师面试官

Java架构追梦

Java 架构 面试 java架构师

解决「停车难」,EMQ 映云科技数据接入方案在智慧停车平台中的应用

EMQ映云科技

大数据 物联网 移动互联网 智慧交通 emq

主打年轻群体,2022款欧拉黑/白猫6.98万元起正式预售!

科技热闻

你敢信?清华毕业大佬用了一个坦克大战项目就讲完了23种设计模式

公众号_愿天堂没有BUG

Java 编程 程序员 架构 面试

拒绝焦虑!Alibaba巨擎随手甩来的一本Java性能优化让我收获满满

Java 编程 架构 面试 阿里

牛啊!长这么大还是头一次见24W字的SpringBoot从入门到实战文档

公众号_愿天堂没有BUG

Java 编程 程序员 架构 面试

2021年8月国产数据库排行榜:TiDB稳榜首,达梦返前三,Kingbase进十强,各厂商加速布局云生态

墨天轮

数据库 opengauss TiDB oceanbase 国产数据库

B轮融资逾2亿高瓴创投领投,最懂金融的RPA厂商金智维有何不凡之处?

王吉伟频道

RPA 金融科技 机器人流程自动化 做市机器人 金智维

校庆小程序开发案例与部署实践

CC同学

搞深度学习框架的那帮人,不是疯子,就是骗子

博文视点Broadview

别慌!阿里专家破SpringBoot:入门+基础+进阶+项目

Java spring 程序员 架构 面试

Linux云计算-MySQL-表操作-索引-外键-视图

学神来啦

MySQL 数据库 Linux 运维

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