我试图回答this问题,人们一直声称可以做类似的事情:
test = super;
test.someMethod();
test.someMethod()将调用super的someMethod实现,打破覆盖。
我不知道如果让事情以这样的方式工作会使重写方法变得不可能?有人可以清楚地解释一下做事的后果,我提出的方法是停止超越工作吗?
编辑:我并不认为这是不可能的,显然是这样。我想要理解的是为什么以这种方式工作是不可能的。
答案 0 :(得分:1)
我不知道动作脚本,但我会冒险猜测。
在Google向我提供的所有文档中,super
一直被称为声明。这使它与switch
和if
处于平等地位。但是,super
明显不同于switch
和if
,这也意味着super
有一些特殊的行为可以让它做它做的事情。这也意味着你不应该将它分配给var。你可以说这可能是对语言的疏忽,也可能是语言灵活性的一个例子。
至于那些说能够超级别名会破坏OOP,特别是压倒一切的人,我认为这只是一个很大的误解。
您认为执行var test = super
会为super
提供别名。正如在test
中一样,它将表现为一个新的super
语句,尽管它不在语言语法中。然而,其他人似乎认为你所做的只是抓取this
类型转换(甚至是动作脚本中的东西?)给超类。
在他们的心理模型中,你想要的东西会打破覆盖,因为将对象强制转换为超类应该只隐藏子类方法。它不应该改变那些仍然可见的行为。
所有这一切都说,我相信var test = super
不能按照你期望的方式工作的原因是因为super
并不意味着用作表达式(可能在=
的右侧,你使用它作为一个表达式会导致奇怪的事情发生。
答案 1 :(得分:0)
1)因为你不知道它被分配给超级。
2)如果你能做你说的话,Employee
如何运作?这是真的吗?这是假的吗?有没有办法检测你正在处理超类?
理论上它可以像你说的那样实现。只需使所有引用都包含多个指针 - 一个指向对象实例,一个指向对象的功能表。
但这会使语言变得更加复杂!一切只是为了促进糟糕的设计。