为什么覆盖大多数OOP语言的静态方法?

时间:2013-11-29 19:04:18

标签: oop language-agnostic static override static-methods

当然不是为了良好的OOP设计 - 因为对派生类的所有实例的共同行为的需求在概念上是非常有效的。此外,如果人们可以说Data.parse(file),在基类中使用通用的parse()代码并让覆盖比在所有数据中实现大多数类似的代码更有效亚型并小心打电话给DataSybtype.parse(file) - 丑丑丑陋

所以必须有一个理由 - 比如表现?

作为奖励 - 是否有OOP语言允许这样做?

欢迎使用特定于Java的参数,因为这是我习惯的 - 但我相信答案是语言无关的。

编辑:理想情况下可以:

<T> void method(Iface<? extends T> ifaceImpl){
    T.staticMeth(); // here the right override would be called
}

这也会因擦除而失败(至少在java中) - 如果擦除正在工作,则需要(需要)实际传递该类:

<T, K extends T> void method(Iface<K> ifaceImpl, Class<K> cls){
    cls.staticMeth(); // compile error
}

有意义吗?是否有语言这样做?除了反思之外还有解决方法吗?

1 个答案:

答案 0 :(得分:0)

对C ++说说

class Foo {
public:
    static  void staticFn(int i);
    virtual void virtFn(int i);
};

虚函数是一个成员函数 - 也就是说,它使用this指针调用,从中查找vtable并找到要调用的正确函数。

显式静态函数不对成员进行操作,因此没有this对象可以从中查找vtable。

当你调用上面的静态成员函数时,你明确地提供了一个固定的静态函数指针。

foo->virtFn(1);

扩展到含糊不清的东西

foo->_vtable[0](foo, 1);

,而

foo->staticFn(1);

扩展为简单的函数调用

Foo@@staticFn(1);

“静态”的全部意义在于它与对象无关。因此,虚拟化是不可能的。