为什么分配对 super 的引用会使重写变得不可能?

Why does assigning a reference to super make overriding impossible?

我试图找到 问题的答案,但人们一直声称能够做如下事情:

test = super;
test.someMethod();

其中 test.someMethod() 将调用 super 的 someMethod 实现,中断覆盖。

我不明白让事情以这种方式工作怎么会使重写方法变得不可能?有人可以清楚地解释按照我建议的方式做事的后果是什么停止覆盖工作吗?

编辑: 我并不是说这是不可能的,显然是不可能的。我想了解的是 为什么 让事情以这种方式工作是不可能的。

我不知道动作脚本,但我会冒险猜测。

在 Google 提供给我的所有文档中,super 始终被称为声明。这使其与 switchif 处于同等地位。然而,super 明显不同于 switchif,这对我来说也意味着 super 有一些特殊的行为,允许它做它所做的事情。这也对我意味着你不应该能够将它分配给一个 var。你能做到这可能是对语言的疏忽,或者是语言有多灵活的一个例子。

至于那些说能够对 super 进行别名会破坏 OOP,特别是重写的人,我认为这只是一个很大的误解。

您认为 var test = super 会给您一个 super 的别名。 As in test 将作为一个新的 super 语句,尽管它不在语言语法中。然而,其他人似乎认为你所做的只是抓住 this 类型转换(这甚至是动作脚本中的东西吗?)到超级 class.

在他们的心智模型中,你想要的会破坏重写,因为将对象转换为超级 class 应该只隐藏子 class 方法。它不应该改变那些仍然可见的行为。

综上所述,我认为 var test = super 无法按您预期的方式工作的原因是 super 不打算用作表达式(可能位于 =) 右侧的东西,而您将其用作表达式会导致发生奇怪的事情。

1) 因为你不知道赋值给super.

2) 如果你说到做到,super == this 是如何运作的?是真的吗?是假的吗?有什么方法可以检测到您正在与超类打交道吗?


理论上可以按你说的实现。只需让所有引用都包含多个指针——一个指向对象实例,一个指向对象的函数table。

但这使得语言变得更加复杂!一切只是为了方便糟糕的设计。