【问题标题】:Why does assigning a reference to super make overriding impossible?为什么分配对 super 的引用会使覆盖变得不可能?
【发布时间】:2015-05-01 09:51:44
【问题描述】:

我试图获得this 问题的答案,但人们一直声称能够执行以下操作:

test = super;
test.someMethod();

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

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

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

【问题讨论】:

    标签: oop inheritance overriding


    【解决方案1】:

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

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

    至于那些说能够给 super 加上别名会破坏 OOP,特别是覆盖,我认为这只是一个很大的误解。

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

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

    话虽如此,我相信var test = super 无法按您期望的方式工作的原因是因为super 不打算用作表达式(可能在=) 的右侧,并且您将其用作表达式会导致奇怪的事情发生。

    【讨论】:

    • 是的,在我看来,“super”应该和“this”一样,除了它让你可以访问父级的方法实现。我认为我觉得它这样工作的原因是因为像 super.someMethod() 这样的语法 - 它看起来很像 this.someMethod()
    【解决方案2】:

    1) 因为你不知道它被分配给了 super。

    2) 如果你能按你说的做,super == this 是如何工作的?这是真的吗?是假的吗?有什么方法可以检测到您正在处理超类吗?


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

    但这使语言变得复杂得多!一切都只是为了助长糟糕的设计。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-10-10
      • 1970-01-01
      • 2012-06-23
      • 1970-01-01
      • 1970-01-01
      • 2023-03-22
      • 1970-01-01
      相关资源
      最近更新 更多