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”语句,而只需调用根据表达式的值自动绑定的方法。

4

2 回答 2

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 的外部客户端为给定字符串注册自己的处理程序来提供一种扩展表的方法。

于 2009-11-30T23:38:24.280 回答
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);
}
于 2009-11-30T23:43:35.470 回答