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语言?
这不适用于任何实际设计.我只是好奇.
在 Java 中不可能。(至少不是没有丑陋的反射黑客。)
我鼓励您重新考虑您的设计并依赖适当的对象。
相关问题:
编辑: B.test()将(或至少根据规范)被编译为对 的调用A.test(),因此无法发现如何从 内部进行调用A.test()。换句话说,没有办法让 的行为A.test取决于它是否是通过A.test()或调用的B.test()。
既然您是出于好奇而问,那么据我所知,这是最接近的“解决方案”。
test进行重载。test(Class<?> c)whotest()在 class 中隐藏(请注意,您无法覆盖)B。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)