作者mgtsai ()
看板java
标题Re: [问题] 有没有可能做到类似函式指标的功能?
时间Fri Jan 8 16:42:36 2010
※ 引述《ciphero (奶油焗蛋饺...:))》之铭言:
: 搜寻过之前的文章了,都没有关於函式指标的议题
: 所以只好上来发问...
: 想像以下程式码:
: Class ABC {
: public printA() {
: System.out.println("这是 printA().");
: }
: public printB() {
: System.out.println("这是 printB().");
: }
: public printC() {
: System.out.println("这是 printC().");
: }
: }
: Class Main {
: public static void main() {
: ABC abc = new ABC();
: if(argv[0]=="printA") abc.printA(); // 若参数为printA,则呼叫printA()
: else if(argv[0]=="printB") abc.printB(); // 若参数为printB,则呼叫printB()
: else if(argv[0]=="printC") abc.printC(); // 若参数为printC,则呼叫printC()
: }
: }
Java 的原始语法里,没有函式指标的概念
但如果有这样的需求时,可以透过一些 pattern 来达到近似的效果
这时,你可以多宣告一个 class,达到类似的功效
(辅以使用 anonymous class,可以让语法更简洁)
public interface PrintMethod
{
public abstract void invoke();
}
public class ABC
{
public static PrintMethod printA = new PrintMethod() {
public void invoke() {
System.out.println("这是 printA().");
}
};
public static PrintMethod printB = new PrintMethod() {
public void invoke() {
System.out.println("这是 printB().");
}
};
public static PrintMethod printC = new PrintMethod() {
public void invoke() {
System.out.println("这是 printC().");
}
};
};
Class Main
{
public static void main(int argc, String[] argv) {
PrintMethod fp; // 类似宣告 void (*fp)(void);
if (argv[0].equals("printA"))
fp = ABC.printA; // 类似 fp = ABC::printA;
else if (argv[0].equals("printB"))
fp = ABC.printB; // 类似 fp = ABC::printB;
else if (argv[0].equals("printC"))
fp = ABC.printC; // 类似 fp = ABC::printC;
fp.invoke(); // 类似呼叫 (*fp)();
}
}
重点在於,多弄一个 method class
把原本的 method body 物件化
甚至不需要动用到 reflection
这样,就可以很轻易地做到类似 function pointer 的功能
甚至是 member function pointer 都做得到
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 60.250.129.52
※ 编辑: mgtsai 来自: 60.250.129.52 (01/08 16:52)
1F:推 PsMonkey:==.==== 这真的有解决原 po 的问题吗? 01/08 16:53
2F:推 petertc:这有解决原po的问题吗?i.e., 不动到dispatcher新增功能 01/08 16:54
3F:→ petertc:慢一步xd 01/08 17:06
4F:→ PsMonkey:\囧/ [扭扭] 01/08 17:12