2011-10-18 57 views
0

下面列出了什么是正式名称。这个例子在c#中,但前提将适用于其他langs。我几乎可以肯定,我在某些其他语言中做过类似这样的事情,但是其中的一个,或者这个概念的名字让我感到遗憾。动态调度(各种)??运行时方法绑定

我试图传达的关键是,在运行时,要执行的方法已确定并调用。这些方法具有几乎相同的签名,只有参数的类型不同,并且参数也都在同一个继承树中。我知道我留下了一些细节,但我想保持简单。

string result; 
User u; 
User user = new User(); 
Manager manager = new Manager(); 

u = user; 
result = _Print(u); 
Console.WriteLine(result); // user... 

u = manager; 
result = _Print(u); 
Console.WriteLine(result); // manager... 

// interested in part 
private static string _Print(User u) 
{ 
    return (u is Manager) ? Print((Manager)u) : Print(u); 
} 

// plumbing 
private static string Print(User u) 
{ 
    return "User..."; 
} 
private static string Print(Manager m) 
{ 
    return "Manager..."; 
} 

class User { ... } 
class Manager : User { ... } 
+0

这不是反模式吗?用户不应该负责提供打印数据吗? –

+0

它只是用于例子的情况。每种方法的有效载荷只是为了提供上下文。 – jasper

回答

1

这是dynamic dispatch。我将它学习为动态绑定,因为它是许多OO语言(如默认实现它的Java)提供的函数绑定功能,而C++则需要使用显式关键字“虚拟”才能在dynamic fashion中工作 - 默认情况下,C++是静态绑定。然而,OO中的现代动态绑定很容易通过PolimorphismOverloading来实现。所以你可以有这样的事情:

User u = new User(); 
Console.WriteLine(u.print()); // user... 

u = new Manager(); 
Console.WriteLine(u.print()); // manager... 


class User { ... 
    public string print(User u) 
    { 
     return "User..."; 
    } 
... } 
class Manager : User { ... 
    public string print(Manager m) 
    { 
     return "Manager..."; 
    } 

... } 

但你需要适应你的语言。我对C#不太了解,而且有太多的特质。我发现这个帖子中有一些例子适合你 - http://www.codeproject.com/KB/cs/dynamicbindingincsharp.aspx

+0

是的,我知道多态,但我的例子是不同的,因为它的语言将在运行时根据参数的类型选择方法。 在维基百科关于动态调度(C++)部分看那篇文章,它谈论重写,这不是上面的内容。在动态分发文章中也有以下说法:“以伪代码表示,代码管理器(handle).handle(y)可以根据对象y的类型调用不同的实现,这就是所谓的多分派。它是否正确? – jasper

+0

是的,你可以做多次调度,但它与重写不同。你的代码看起来像覆盖。你说的话让我想起了策略模式 - http://en.wikipedia.org/wiki/Strategy_pattern - 你可以切换算法以在运行时处理某些事情(它可以基于参数类型,标志或别的东西)。 – darlinton