为什么有些语言更喜欢静态方法绑定而不是动态方法绑定

本文关键字:绑定 动态 方法 静态方法 语言 更喜欢 为什么 | 更新日期: 2023-09-27 17:50:21

为什么c++、c#和Ada 95默认使用静态方法绑定,而不是动态方法绑定?

实现速度的提高是否值得抽象和可重用性的损失?

为什么有些语言更喜欢静态方法绑定而不是动态方法绑定

一般来说,您可以考虑必须为可扩展性设计基类。如果一个成员函数(使用c++词汇表)没有被设计为被重写,那么很有可能在实践中不可能重写它,并且在不知道类设计者认为是实现细节的情况下肯定不可能重写它,并且会在没有事先通知的情况下更改它。

关于两种语言的一些额外注意事项(我对c#的了解还不够多,无法写下来):

  • 如果选择不同,Ada 95将与Ada 83存在兼容性问题。考虑到Ada 95的整个对象模型,这样做是没有意义的(但您可以考虑兼容性是选择对象模型的一个因素)。

  • 对于c++,性能肯定是一个因素。不为不用的东西买单原则,以及将c++作为一个更好的C语言的可能性,对c++的成功起了很大的作用。

最明显的答案是大多数函数不应该是虚函数。正如程序员指出的那样,除非一个函数被明确地设计为可以被重写,否则你可能无法在不破坏类不变量的情况下重写它(虚函数或非虚函数)。(例如,当我在Java中工作时,我最终将大多数函数声明为final,这是一个好的工程问题。c++和Ada做出了正确的决定:作者必须明确声明该函数是被设计为可重写的。

另外,c++和(我认为)Ada也支持值语义。值语义不能很好地处理多态性;在Java中,像java.lang.String这样的类是final,以便为它们模拟值语义。然而,对于许多应用程序程序员来说,不必麻烦,因为它不是默认的。(类似地,当类是多态的时候,太多的c++程序员忽略了禁止复制和赋值。)

最后,即使一个类是多态的,并且是为继承而设计的,契约仍然是指定的,并且在合理的范围内,在基类中强制执行。在c++中,这通常意味着public函数不是虚函数,因为它是定义和执行契约的公共函数。

我不能谈论Ada,但是对于c++来说,设计c++的两个重要目标是:

    与C的向后兼容性
  • 你不应该为你不使用的功能支付任何费用(尽可能)

虽然这两种情况都不能说明动态绑定不能被选择为默认值,但是使用静态方法绑定(我假设您指的是非虚拟成员函数)似乎更"适合"这些设计目标。

我会给出Michael Burr的另外三分之二的答案。

对于Ada来说,一个重要的设计目标是使该语言适合于系统编程和在小型实时嵌入式设备(例如:导弹和炸弹cpu)上使用。也许现在有一些技术可以让动态语言很好地完成这些事情,但在70年代末和80年代初,当这种语言刚被设计出来的时候,肯定没有。Ada95当然不可能从根本上偏离原始语言的基本底层设计,就像c++不可能偏离C一样。

也就是说,如果你真的需要的话,Ada和c++(当然c#也一样)都提供了一种实现动态方法绑定("动态分派")的方法。在这两种情况下,它都是通过指针访问的,恕我直言,这有点容易出错。它还可能使调试变得有点痛苦,因为很难单独从源代码中准确地判断正在调用的是什么。所以除非我真的需要,否则我会避免使用