2009-11-30 61 views
3

長時間的開關狀態常常被忽視。解決方案是使用多態。但是,如果我打開的東西不是一個類型代碼?我想這樣做的是像這樣的東西更換switch語句...基於變量值的動態方法調度

public void HandleString(string s = "Hello") 
{ 
... 
} 

public void HandleString(string s = "Goodbye") 
{ 
... 
} 

... 
HandleString("Hello"); // results in the first method being called. 

這將替換以下...

string s = "Hello"; 

switch(s) 
{ 
    case "Hello": 
    ... 
    break; 
    case "Goodbye": 
    ... 
    break; 
    default; 
    break; 
} 

任何想法?從理論上講,我認爲你可以完全消除'if/switch'語句,只需調用基於表達式值自動綁定的方法。

回答

1

有些語言可以實現這種語義。我熟悉的是從Phillips名爲Elegant的編譯器生成器工具。

在這樣的語言,簡單的階乘算法可能是這樣的:

fact (value : Int) : Int 
    conditions value < 0 
{ 
    { "Illegal input value\n" } astype Message 
    return 0 
} 

fact (value = 0) : Int 
{ 
    return 0 
} 

fact (value = 1) : Int 
{ 
    return 1 
} 

fact (value : Int) : Int 
{ 
    return value * fact(value - 1); 
} 
+0

Common Lisp是一種相對廣爲人知的語言,它允許一種調度方法超過特定的值(以及其他類型常見的類型)。 – 2009-12-01 00:51:25

16

如果你有大量的選項,以及高的可能性將有更多的未來 - 或者你只是需要系統能夠輕鬆擴展 - 那麼你可以隨時使用明確的調度表:

Dictionary<string, Action<string>> actions = 
    new Dictionary<string, Action<string>>() 
    { 
     { "Hello", HandleHello }, 
     { "Goodbye", HandleGoodbye } 
    }; 

private static void HandleHello(string s) { ... } 

private static void HandleGoodbye(string s) { ... } 

... 

actions[s](s); 

您還可以通過允許API的外部客戶端爲給定字符串註冊自己的處理程序來提供擴展表的方法。

+1

+1正是我要說的,但我鍵入:-) – 2009-11-30 23:39:55

+0

當然慢,但我寧願有語言爲我執行它。 – 2009-12-01 15:12:06