相当于其他流行语言中的后期静态绑定(PHP)

jet*_*tru 7 php c++ python java

<?php
class A {
    public static function who() {
        echo __CLASS__;
    }
    public static function test() {
        static::who(); // Here comes Late Static Bindings
    }
}

class B extends A {
    public static function who() {
        echo __CLASS__;
    }
}

B::test(); // Outputs "B"
?>
Run Code Online (Sandbox Code Playgroud)

我希望在Java中得到一个等价的东西......就像这样

class A {
    public static void who(){
        System.out.println("A");
    };

    public static void test(){
        who(); //<<< How to implement a static:: thing here???
    }
}

class B extends A {
     public static void who(){
        System.out.println("B");
     };

     public static void main(String[] args){
        B.test(); // Outputs "A" but I want "B"
     }
}
Run Code Online (Sandbox Code Playgroud)

我想通过who()调用A::test在PHP 5.3中解析内部调用B::who.

编辑:我知道在大多数流行语言中没有"标准方法".我正在寻找黑客等等.此外,这可能在C/C++或任何其他流行的OOP语言?

这不适用于任何实际设计.我只是好奇.

aio*_*obe 2

在 Java 中不可能。(至少不是没有丑陋的反射黑客。)

我鼓励您重新考虑您的设计并依赖适当的对象。

相关问题:

编辑: B.test()将(或至少根据规范)被编译为对 的调用A.test(),因此无法发现如何从 内部进行调用A.test()。换句话说,没有办法让 的行为A.test取决于它是否是通过A.test()或调用的B.test()

既然您是出于好奇而问,那么据我所知,这是最接近的“解决方案”。

  1. 使用定义预期方法的类作为参数test进行重载。test(Class<?> c)who
  2. test()在 class 中隐藏(请注意,您无法覆盖)B
  3. 并稍微改变一下实现A.test

在代码中:

class A {
    public static void who() {
        System.out.println("A");
    }

    public static void test() {
        test(A.class);
    }

    public static void test(Class<?> c) {
        //who(); //<<< How to implement a static:: thing here???
        try {
            c.getMethod("who").invoke(null); // Call static who on given class.
        } catch (Exception e) {
        }
    }

}

public class B extends A {
     public static void who(){
        System.out.println("B");
     }

     public static void test() {
         test(B.class);
     }

     public static void main(String[] args){
        A.test(); // Outputs "A"
        B.test(); // Outputs "B"
     }
}
Run Code Online (Sandbox Code Playgroud)