运行时方法绑定

时间:2011-10-18 23:51:39

标签: c# polymorphism dispatch

我在下面列出的内容是否有正式名称。示例在c#中,但前提适用于其他语言。我几乎可以肯定我几年前在其他一些语言中做过类似的事情,但是这个或者概念的名字逃脱了我。动态调度(各种)??

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

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 { ... }

1 个答案:

答案 0 :(得分:1)

dynamic dispatch。我将它理解为动态绑定,因为它是许多OO语言提供的函数绑定功能,例如Java,默认情况下实现它,以及C ++,它在显式关键字“virtual”中需要它才能在{ {3}} - 默认情况下,c ++是静态绑定。但是,在OO中,现代动态绑定很容易通过dynamic fashionPolimorphism实现。所以你可以这样:

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#了解不多,而且有很多特质。我发现这篇文章有一些例子 - Overloading