基于变量值的动态方法调度

时间:2009-11-30 23:34:07

标签: c# methods polymorphism dynamic-dispatch

长开关声明通常不受欢迎。解决方案是使用多态。但是,如果我正在打开的东西不是类型代码呢?我想做的是用这样的东西替换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'语句,只调用基于表达式值自动绑定的方法。

2 个答案:

答案 0 :(得分: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)

有些语言可以实现这种语义。我熟悉的是编译器生成器工具,名为Elegant from Phillips。

在这样的语言中,简单的因子算法可能如下所示:

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);
}