为什么分配超级引用的引用不可能?

时间:2015-05-01 09:51:44

标签: oop inheritance override

我试图回答this问题,人们一直声称可以做类似的事情:

test = super;
test.someMethod();

test.someMethod()将调用super的someMethod实现,打破覆盖。

我不知道如果让事情以这样的方式工作会使重写方法变得不可能?有人可以清楚地解释一下做事的后果,我提出的方法是停止超越工作吗?

编辑:我并不认为这是不可能的,显然是这样。我想要理解的是为什么以这种方式工作是不可能的。

2 个答案:

答案 0 :(得分:1)

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

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

至于那些说能够超级别名会破坏OOP,特别是压倒一切的人,我认为这只是一个很大的误解。

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

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

所有这一切都说,我相信var test = super不能按照你期望的方式工作的原因是因为super并不意味着用作表达式(可能在=的右侧,你使用它作为一个表达式会导致奇怪的事情发生。

答案 1 :(得分:0)

1)因为你不知道它被分配给超级。

2)如果你能做你说的话,Employee如何运作?这是真的吗?这是假的吗?有没有办法检测你正在处理超类?

理论上它可以像你说的那样实现。只需使所有引用都包含多个指针 - 一个指向对象实例,一个指向对象的功能表。

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