Re: [問題] 有沒有可能做到類似函式指標的功能?
※ 引述《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)
推
01/08 16:53, , 1F
01/08 16:53, 1F
推
01/08 16:54, , 2F
01/08 16:54, 2F
→
01/08 17:06, , 3F
01/08 17:06, 3F
→
01/08 17:12, , 4F
01/08 17:12, 4F
討論串 (同標題文章)