写点什么

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

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

关注

评论

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

MSVC编译动态库

Loken

音视频 5月月更

从冬奥跳台飞跃向千家万户:联通“臻宽带”的起跳瞬间

脑极体

InfoQ 极客传媒 15 周年庆!无限生长未来可期!

InfoQ写作社区官方

热门活动 InfoQ极客传媒15周年庆

了解es6语法简介

小恺

6月月更

将虚幻引擎5与Perforce Helix Core集成使用吧!

龙智—DevSecOps解决方案

perforce 虚幻引擎5 Helix Core

DataPipeline:让数据生产力的历史进程,再前进一步

DataPipeline数见科技

DataOps 数据管理

自助洗车机还能加盟你不知道吧?

共享电单车厂家

自助洗车机 自助洗车加盟

哪些人比较适合加盟自助洗车

共享电单车厂家

加盟自助洗车

24小时无人自助洗车要如何加盟?

共享电单车厂家

自助洗车加盟

将不费吹灰之力成为卷王的秘籍传授于你!

龙智—DevSecOps解决方案

Jira插件 龙智自研插件 Jira飞书插件

顶级好用的 React 表单设计生成器,可拖拽生成表单

蒋川

低代码 开发工具 React 表单 组件

孩子上网冲浪更安全,这份儿童节礼物值得拥有

最新动态

使用Sonar来优化您的基础架构代码

龙智—DevSecOps解决方案

漏洞 SonarQube

特别的儿童节,OceanBase 送上一份特别的惊喜

OceanBase 数据库

oceanbase

Redis 忽然变慢了如何排查并解决?

码哥字节

redis Redis 核心技术与实战 6月月更

关键点标注的酷炫,你想象不到

澳鹏Appen

人工智能 数据标注 数据训练 关键点检测 关键点

看完这篇异地多活的改造,我决定和架构师battle一下 / 得物技术

得物技术

架构 容灾 双活 双活容灾 异地多活

C#入门系列(一) -- 初识C#语言

陈言必行

C# 6月月更

八大误区,逐个击破:担忧安全防护与合规性?这可能是您对云最大的误解

龙智—DevSecOps解决方案

Atlassian atlassian云版 Atlassian白皮书

那些年,我们在Apache SeaTunnel 2.1.0部署中踩过的坑【含源码分析】

Apache SeaTunnel

Apache 大数据 开源 workflow Seatunnel

儿童节,和 AI 一起通关 “超级马里奥兄弟”

华为云开发者联盟

展示 Postlight 的 WordPress + React Starter Kit

海拥(haiyong.site)

WordPress 6月月更

应用实践|Lifewit 数据平台基于Apache Doris的建设实践

SelectDB

数据库 数据仓库 apache doris SelectDB

有了这个云端Mock功能,你的简历起码提升30分!

Liam

前端 Postman 前端教程 API文档 前端工具

6元自助洗车机一般都什么价位

共享电单车厂家

自助洗车加盟 6元自助洗车机

为什么PO的角色在Scrum框架中不可替代

ShineScrum

Scrum 产品经理 PO 产品负责人

洗车行业前景好不如开个自助洗车店

共享电单车厂家

自助洗车加盟 开自助洗车店

OpenHarmony 3.1 Release版本关键特性解析——OpenHarmony新音视频引擎——HiStreamer

OpenHarmony开发者

Open Harmony

雅加达利用SAS优化抗疫救助资金发放,帮助中小微企业度过难关

E科讯

字节跳动数据库的过去、现状与未来

火山引擎开发者社区

数据库 微服务 分布式数据库

博睿数据拨测入场加速广电深度融合

博睿数据

智能运维 博睿数据 智慧广电

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