C#是单一分派语言还是多分派语言?
我想弄清楚什么是单次和多次调度 我刚刚读到:C#是单一分派语言还是多分派语言?,c#,programming-languages,multiple-dispatch,single-dispatch,C#,Programming Languages,Multiple Dispatch,Single Dispatch,我想弄清楚什么是单次和多次调度 我刚刚读到: 从这个定义来看,在我看来,C#和VB.Net是多分派的,即使选择调用哪个重载是在编译时进行的 我是对的,还是我遗漏了什么? 谢谢 C#是单次发送,但有些博客文章的标题看起来像是在模仿多种方法。如果我能下载其中一篇文章,我会在这里更新我的答案。C#是单次发送,但有些博客文章的标题看起来像是在模仿多种方法。如果我能下载其中一篇文章,我将在这里更新我的答案。GoF访问者模式就是如何进行双重分派的一个示例。Scott Meyers“更有效的C++”向你展示
从这个定义来看,在我看来,C#和VB.Net是多分派的,即使选择调用哪个重载是在编译时进行的 我是对的,还是我遗漏了什么?
谢谢 C#是单次发送,但有些博客文章的标题看起来像是在模仿多种方法。如果我能下载其中一篇文章,我会在这里更新我的答案。C#是单次发送,但有些博客文章的标题看起来像是在模仿多种方法。如果我能下载其中一篇文章,我将在这里更新我的答案。GoF访问者模式就是如何进行双重分派的一个示例。Scott Meyers“更有效的C++”向你展示了如何在C++中完成它。这里有一个多布斯博士的文章,讨论如何在java和C++中进行双调度。 < p> GoF访问者模式是如何进行双调度的例子。Scott Meyers“更有效的C++”向你展示了如何在C++中完成它。这里有一个多布斯博士的文章,讨论如何在java和C++中进行双调度。 < P> C不支持多调度。Visitor设计模式模拟可以描述为多重分派的东西,尽管Visitor模式主要关注将算法从层次结构中分离出来。C#不支持多重分派。Visitor设计模式模拟可以被描述为多重分派的东西,尽管Visitor模式主要关注将算法从层次结构中分离出来。根据定义,多重分派基于所涉及对象的运行时类型,因此C#和VB.net不使用它,因为决策是在编译时做出的。根据定义,多重分派基于所涉及对象的运行时类型,所以C#和VB.net不使用它,因为决策是在编译时做出的。好,我理解了函数重载与多重分派之间的细微差别 基本上,区别在于是在运行时还是在编译时选择调用哪个方法。现在,我知道每个人都这么说了,但没有一个明确的例子,这听起来很明显,因为C#是静态类型的,而多个调度语言(至少在我看来)似乎是动态类型的。到目前为止,对于这个定义,多重分派和函数重载对我来说听起来完全一样 这种情况下,一个方法有两个重载,它们在参数类型上不同,但这两个类型是多态的,并且调用时引用声明为较高的类型,该类型具有较低类型的对象。。。 (如果有人能想出更好的表达方式,请随意编辑此答案) 例如:
int CaptureSpaceShip(IRebelAllianceShip ship) {}
int CaptureSpaceShip(XWing ship) {}
void Main() {
IRebelAllianceShip theShip = new XWing();
CaptureSpaceShip(theShip);
}
XWing显然实现了iRebeallianceship。
在这种情况下,将调用第一个方法,而如果C#实现了多个分派,则将调用第二个方法
关于医生复职的事很抱歉。。。在我看来,这似乎是解释这种差异的最清晰的方式,而不仅仅是阅读每个分派方法的定义
要获得更正式的解释:
好的,我理解了函数重载与多重分派之间的细微差别 基本上,区别在于是在运行时还是在编译时选择调用哪个方法。现在,我知道每个人都这么说了,但没有一个明确的例子,这听起来很明显,因为C#是静态类型的,而多个调度语言(至少在我看来)似乎是动态类型的。到目前为止,对于这个定义,多重分派和函数重载对我来说听起来完全一样 这种情况下,一个方法有两个重载,它们在参数类型上不同,但这两个类型是多态的,并且调用时引用声明为较高的类型,该类型具有较低类型的对象。。。 (如果有人能想出更好的表达方式,请随意编辑此答案) 例如:
int CaptureSpaceShip(IRebelAllianceShip ship) {}
int CaptureSpaceShip(XWing ship) {}
void Main() {
IRebelAllianceShip theShip = new XWing();
CaptureSpaceShip(theShip);
}
XWing显然实现了iRebeallianceship。
在这种情况下,将调用第一个方法,而如果C#实现了多个分派,则将调用第二个方法
关于医生复职的事很抱歉。。。在我看来,这似乎是解释这种差异的最清晰的方式,而不仅仅是阅读每个分派方法的定义
要获得更正式的解释:
对于那些使用搜索引擎查找本文的人,C#4.0引入了关键字。代码如下所示
int CaptureSpaceShip(IRebelAllianceShip ship) {}
int CaptureSpaceShip(XWing ship) {}
void Main() {
IRebelAllianceShip theShip = new XWing();
CaptureSpaceShip((dynamic)theShip);
}
对于那些使用搜索引擎查找本文的人,C#4.0引入了关键字。代码如下所示
int CaptureSpaceShip(IRebelAllianceShip ship) {}
int CaptureSpaceShip(XWing ship) {}
void Main() {
IRebelAllianceShip theShip = new XWing();
CaptureSpaceShip((dynamic)theShip);
}
我知道这是个老问题
在.NET4.0中,您可以对多种方法使用
dynamic
关键字。。。看下面的例子我知道这是一个老问题
在.NET4.0中,您可以对多种方法使用
dynamic
关键字。。。请看下面的示例也许有人会对使用动态关键字()
我们可以创建同一方法的多个重载,根据其参数类型的不同组合进行专门化:
void ReactSpecialization(Animal me, Animal other)
{
Console.WriteLine("{0} is not interested in {1}.", me, other);
}
void ReactSpecialization(Cat me, Dog other)
{
Console.WriteLine("Cat runs away from dog.");
}
void ReactSpecialization(Cat me, Mouse other)
{
Console.WriteLine("Cat chases mouse.");
}
void ReactSpecialization(Dog me, Cat other)
{
Console.WriteLine("Dog chases cat.");
}
现在是神奇的部分:
void React(Animal me, Animal other)
{
ReactSpecialization(me as dynamic, other as dynamic);
}
这是因为“as dynamic”cast告诉C#编译器,而不仅仅是调用ReactSpecialization(Animal,Animal),动态检查每个参数的类型,并在运行时选择调用哪个方法重载
为了证明它确实有效:
void Test()
{
Animal cat = new Cat();
Animal dog = new Dog();
Animal mouse = new Mouse();
React(cat, dog);
React(cat, mouse);
React(dog, cat);
React(dog, mouse);
}
输出:
Cat runs away from dog.
Cat chases mouse.
Dog chases cat.
Dog is not interested in Mouse.
维基百科说C#4.0(动态)是“多重di”