![]() |
1
29
这是规定,你可能不喜欢。。。
原因是因为该方法(这是一个更好的签名匹配)可能已添加到更高版本中,从而引入了一个“ brittle base class “失败 注意 :这是C规范中相当复杂/深入的一部分,它到处都是。但是,您遇到的问题的主要部分如下所示 更新
我引用的是 方法调用的运行时处理 ,应该是。
请看埃里克的帖子答案 https://stackoverflow.com/a/52670391/1612975 关于这里发生了什么和规格的适当部分的完整细节 C级# 语言规范 版本5.0
在接口方面,当考虑到实现重载行为是为了防止基类脆弱时,这是有意义的 额外资源 Eric Lippert, Closer is better
|
![]() |
2
15
正当理由 为什么规格是好的。 假设我们有基类B和派生类D。B有一种方法M,就是长颈鹿。现在,记住, . 换言之:D的作者必须知道 更多 比B的作者,因为 ,和 编写D是为了将B扩展到B尚未处理的场景 . 因此,我们应该相信D的作者正在做一个 实施工作 全部的 D的功能比B的作者强。 他们说,如果D的作者制造了一个超负荷的M来带走一只动物 . 当给D.M(长颈鹿)打电话叫D.M(动物),而不是给B.M(长颈鹿)打电话时,我们应该期望过载解决。
两个理由都是关于 特异性 ,那么哪种理由更好呢? 我们不会用任何方法对付动物 ! 我们正在调用D上的方法,所以 专一性应该是赢家。特殊性 接受者 比任何一个参数的特异性都重要得多。 . 重要的是确保我们选择最具体的 接受者 因为 这个方法是后来由一个更了解D要处理的场景的人编写的
弗斯特 ,D的作者应该知道D.M(动物) ,并且必须按照 正确的事情 实施细则 当然是D,不是 公共区域的一部分 更改是否重写方法 变化 选择哪种方法 . 想象一下,如果在一个版本中调用某个基类上的方法,然后在下一个版本中,基类的作者对是否重写某个方法做了一个小的更改;你不会期望超负荷解决 在派生类中 改变。C#经过精心设计,可防止此类故障。 |