编译时间多态/重载

时间:2011-03-30 20:27:02

标签: c# .net polymorphism

为什么重载被认为是多态的一种形式,或者是实现多态的一种方式。

对我而言,多态性意味着多种形式,我不太清楚过载是如何帮助实现这一目标的。

5 个答案:

答案 0 :(得分:7)

多态性是在运行时时发生的事情。就OOP而言,它是调用方法的实践,并且在编译时,知道将调用该方法的对象。经典的例子是Shapes,Circles,Squares等。你有一个Shapes集合,每个Shapes都被实例化为Circle,Square等等。编译器既不知道也不关心在任何给定时间您正在调用哪种类型的形状DrawErase;程序运行时会发生这种决定。

方法重载发生在编译时。您有多种方法具有相同的名称,但不同的参数。当您调用其中一个方法时,编译器将根据您提供的参数决定哪个重载最匹配。

  

为什么重载被认为是多态的一种形式,或者是实现多态的一种方式。

在root上,多态性是在同一API下处理多个类型的能力。从技术上讲,方法重载确实属于这个问题。实际上,根据wikipedia,方法重载被称为“ad-hoc多态”,但我从未听过现实生活中使用的这个术语(并不是说我是最后的权威)。 通常多态性仅指方法的动态绑定,如Shape,Circle,Square示例。

还有“参数多态”,虽然这通常是我可能有限的经验,根据语言被称为泛型或模板(它们相同;存在细微差别两者之间)

答案 1 :(得分:2)

  

为什么重载被认为是一种多态的形式

不是。这是不正确的信息。重载不是多态。来自Wikipedia's Polymorphism in object-oriented programming页面:

  

方法重载和方法重写都不是多态的实现。

答案 2 :(得分:2)

方法重载可能是动态语言或使用多个分派来解决方法重载的语言中的一种多态,但它不在C#中。 C#的方法重载没有多态性,因为每次调用的重载都是在编译时严格选择的(dynamic变量除外)。

<强>更新

@Lee表示“不需要将多态性作为运行时机制。”

是的,有。

在C#中,方法重载是一种方便的方式,通过为多个方法提供相同的名称来传达意图,并避免令人讨厌的方法名称。但是假设一秒钟C#没有方法重载。假设方法的签名完全由其名称组成,忽略参数类型。在这种假设的语言中会丢失什么?

嗯,在这种语言中,我们必须给每个方法一个不同的名称。我们必须创建WriteLineString,WriteLineInt32,WriteLineUInt32等。从可用性的角度来看,它会非常糟糕。

但是语言的表达能力会有什么变化呢?没有。只需对方法名称进行一些更改,我们仍然可以编写相同的代码。编译器将解析对相同位置的相同调用。 IL将完全相同。效率,功效或复杂性没有区别。

因此,如果语言的表达能力和编译后的代码在C#和no-overloads-C#中是相同的,那么重载怎么可能被认为是“多态”?多态性意味着基于对象的类型展示不同的行为。如果删除重载没有什么可以改变对象的行为,那么多重怎么会超载?

运行时编译时行为是多态的核心,它与方法重载无关。

答案 3 :(得分:1)

这是有争议的,但有些人认为它是一种形式,因为它允许您使用相同的名称处理多个表单。如:

public static class Math
{
    int Min(int x, int y) { ... }

    double Min(double x, double y) { ... }
}

通过这种方式,您可以调用Math.Min,它将根据传递给它的参数类型选择正确的方法(是的,您也可以使用泛型来做,但只是作为重载的简单说明)。

答案 4 :(得分:0)

当您需要采用不同类型参数的相同方法的不同版本时,可以使用方法重载。重载是一种面向对象的编程概念,就像多态一样。重载与对象多态性不同。

使用对象多态性,您可以为提供相同方法和签名的实现的对象定义不同的行为。