为什么热插拔vtables不是一种流行的语言功能?

dsi*_*cha 5 oop pointers virtual-functions language-design

在面向对象的编程中,能够修改已创建对象的行为有时会很好.当然,这可以通过相对冗长的技术来完成,例如策略模式.但是,有时通过在实例化后更改vtable指针来完全更改对象的类型会更好.假设你从A级转换到B级,这将是安全的:

  1. B类是A类的子类,不添加任何新字段,或
  2. B类和A类具有相同的父类.除了从父类重写虚函数之外,都不做任何事情.(没有新的字段或虚函数.)
  3. 在任何一种情况下,A和B必须具有相同的不变量.

这在C++和D编程语言中是可以攻击的,因为指针可以随意转换,但是它太丑陋且难以理解,我害怕在需要其他人理解的代码中执行它.为什么通常不提供更高级别的方法呢?

aku*_*uhn 3

因为大多数语言设计者的思维方式过于静态。

虽然这些功能对于程序员来说是危险的,但它们对于库构建者来说是必要的工具。例如,在 Java 中,无需调用构造函数即可创建对象(是的,您可以!),但这种权力仅授予库设计者。然而,库设计者所追求的许多功能在 Java 中却是不可能实现的。另一方面,C# 在每个版本中添加了越来越多的动态功能。我真的很期待使用即将推出的 DLR(动态语言运行时)构建的所有出色的库。

在一些动态语言中,例如 Smalltalk(据我所知 Perl 和 Python,但不知道 Ruby),完全有可能更改对象的类。在 Pharo Smalltalk 中,您可以通过以下方式实现这一目标

object primitiveChangeClassTo: anotherObject
Run Code Online (Sandbox Code Playgroud)

这会将 的类更改object为 的类anotherObjectobject become: anotherObject请注意,这与交换两个对象的所有指针不同。