C# 为什么有些语言更喜欢静态方法绑定而不是动态方法绑定? 为什么C++中的默认决策,艾达和95使用静态方法绑定,而不是动态方法绑定?? 在实现速度上的增益是否值得在抽象和重用中丢失?,一般来说,您可以考虑为扩展性设计基类。如果一个成员函数(使用C++词汇表)不是被设计为重写的,那么有一个很好的机会,它将比它在实践中是不可能的,并且肯定地,如果不知道类设计者认为是实现细节,并且在不事先通知的情况下改变,它是不可能的。p>

C# 为什么有些语言更喜欢静态方法绑定而不是动态方法绑定? 为什么C++中的默认决策,艾达和95使用静态方法绑定,而不是动态方法绑定?? 在实现速度上的增益是否值得在抽象和重用中丢失?,一般来说,您可以考虑为扩展性设计基类。如果一个成员函数(使用C++词汇表)不是被设计为重写的,那么有一个很好的机会,它将比它在实践中是不可能的,并且肯定地,如果不知道类设计者认为是实现细节,并且在不事先通知的情况下改变,它是不可能的。p>,c#,c++,ada,dynamic-binding,late-static-binding,C#,C++,Ada,Dynamic Binding,Late Static Binding,两种语言的一些附加注意事项(我对C语言的了解还不足以写这方面的内容): 如果选择不同,Ada 95可能与Ada 83存在兼容性问题。考虑到艾达95的整个对象模型,不同的做法是没有意义的(但你可以认为兼容性是选择对象模型的一个因素)。 对于C++来说,性能无疑是一个因素。你不为你不使用的原理付费,使用C++的可能性,就像一个更好的C在它的成功中有很大的作用。 我不能谈论艾达,但是对于C++来说,C++设计的两个重要目标是: 与C的向后兼容性 对于不使用的功能,您不应(尽可能)支付任何费用

两种语言的一些附加注意事项(我对C语言的了解还不足以写这方面的内容):

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

  • 对于C++来说,性能无疑是一个因素。你不为你不使用的原理付费,使用C++的可能性,就像一个更好的C在它的成功中有很大的作用。


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

  • 与C的向后兼容性
  • 对于不使用的功能,您不应(尽可能)支付任何费用

虽然这两者都不一定意味着动态绑定不能被选为默认绑定,但使用静态方法绑定(我想你是指非虚拟成员函数)似乎更符合这些设计目标。

显而易见的答案是,大多数函数不应该是虚拟的。正如一位程序员指出的,除非函数被明确设计为被重写,否则在不破坏类不变量的情况下,您可能无法重写它(虚拟或非虚拟)。(例如,当我在java中工作时,我最终声明了大多数函数<代码>最终< /COD>,作为一个好的工程。C++和艾达做出正确的决定:作者必须明确地指出函数被设计为重写。< /P> <>也有C++支持,(艾达)支持值语义。值语义在多态性中不好用;在java中,类如代码> java .Lang.Stult是代码>最终< /C> >,以模拟它们的值语义。然而,对于许多应用程序,程序员不必担心,因为它不是默认的。(以类似的方式,太多的C++程序员省略了在类是多态时禁止复制和赋值)。

最后,即使当一个类是多态的,并且设计用于继承时,契约仍然是指定的,并且在基本类中是合理的,强制的。在C++中,这通常意味着<代码>公共< /Cuff>函数不是虚拟的,因为它是定义和执行契约的公共函数。< / P> < P>我给出一个T。他回答了迈克尔·伯尔的另外三分之二的问题

对于Ada来说,一个重要的设计目标是使该语言适合于系统编程和在小型实时嵌入式设备(例如:导弹和炸弹CPU)上使用也许现在有一些技术可以让动态语言来做这些事情,但是在70世纪末和80年初,语言最初是设计出来的。当然,ADA95不能根本偏离原始语言的基本设计,除了C++之外,C.<

艾达和C++(以及C.C.Type)都提供了一种实现动态方法绑定的方法(“动态调度”)如果你真的想要的话。在这两种情况下,它都是通过指针访问的,我觉得这很容易出错。这也会让调试变得有点困难,因为单从源代码很难准确地分辨调用了什么。所以除非我真的需要它,否则我会避免使用它。

这种默认行为会导致抽象和可重用性的丧失吗?你可以实现它nyway不能吗?我不认为实现速度是一个因素;从静态方法调用到动态方法调用的成本差异非常小。我也不同意你关于抽象性或可重用性损失的假设。在标题中添加“一些”是为了使它更好地匹配问题(并且少一点争论)实际上,这是一个很好的问题,如果框架正确的话。马丁可以说,任何一种认为需要为作者提供例程的语言需要被内联(既作为艾达,又是C++)来删除子程序调用开销,则可能会嫉妒“琐碎”。使所有内容动态化的额外成本。@T.E.D.--特别是在Ada的情况下,允许访问子程序以[更]容易地生成。正常的静态默认值是“整体推进”[类似宏]默认情况下,动态调用是动态的……动态调用虽然因其间接表而灵活,但也很容易受到攻击,因为该表可能会被内存中的某个人损坏。我在用Ada编写的实时任务关键型系统上使用了动态调度,所以我的方法并非不可行:)@NWS-哦,绝对不是。OpenToken,我最初的Ada解析器生成器的作者,是围绕动态分派构建的。如果你不得不使用类似于一个大喇叭的
case
语句,它并不会让你失去很多东西。@TED,我确信你知道它是实用的,jus认为应该指出它至少,它在现实世界中也很实用:)