为什么重载被认为是多态的一种形式,或者是实现多态的一种方式。
多态对我来说意味着多个表单,我不太明白重载如何帮助实现这一点。
发布于 2011-03-31 04:28:41
多态性是在运行时中发生的事情。就OOP而言,它是调用方法的实践,并且在编译时,不知道将在哪个对象上调用该方法。典型的例子是Shapes、Circle、Square等。您有一个Shape集合,每个集合都实例化为Circle、Square等。编译器既不知道也不关心您在任何给定时间对哪种类型的形状调用Draw
或Erase
;这种确定发生在程序运行时。
方法重载发生在编译时。您有多个方法具有相同的名称,但具有不同的参数。当您调用其中一个方法时,编译器将根据您提供的参数决定哪个重载最匹配。
为什么重载被认为是多态的一种形式,或者是实现多态的一种方式。
从根本上说,多态性是在同一API下处理多个类型的能力。所以从技术上讲,方法重载确实属于这一类。事实上,根据wikipedia的说法,方法重载被称为“即席多态”,但我在现实生活中从未听说过这个术语(并不是说我是最终权威)。通常是指方法的动态绑定,例如Shape,Circle,Square示例。
还有“参数多态性”,尽管根据我有限的经验,这通常被称为泛型或模板,这取决于语言(它们是不一样的();两者之间有细微的差异)
发布于 2011-03-31 04:30:28
为什么重载被认为是多态性的一种形式
事实并非如此。这是不正确的信息。重载不是多态性。从Wikipedia's Polymorphism in object-oriented programming页面:
方法重载和方法重载本身都不是多态性的实现。
发布于 2011-03-31 04:36:22
在动态语言或使用多分派来解决方法重载的语言中,方法重载可能是多态性的一种形式,但它不在C#中。C#的方法重载中没有多态性,因为每次调用的重载都是在编译时严格选择的( dynamic
变量除外)。
更新
@Lee表示,“多态性不需要成为运行时机制。”
是的,有。
在C#中,通过赋予多个方法相同的名称,方法重载是传达意图和避免讨厌的方法名称的一种便捷方法。但是假设一下,C#没有方法重载。假设一个方法的签名完全由它的名称组成,忽略参数类型。在这种假设的语言中会失去什么?
嗯,在这种语言中,我们必须给每个方法一个不同的名称。我们将不得不创建WriteLineString、WriteLineInt32、WriteLineUInt32等。从可用性的角度来看,这将是非常糟糕的。
但是,这种语言的表达能力会发生什么变化呢?没什么。我们仍然可以编写相同的代码,只需对方法名称进行一些更改。编译器会将相同的调用解析到相同的位置。IL将完全相同。在效率、功率或复杂性方面没有区别。
因此,如果语言的表达能力和编译后的代码在C#和无重载的C#中是相同的,那么重载怎么可能被认为是“多态性”呢?多态性意味着根据对象的类型表现出不同的行为。如果移除重载并不能改变对象的行为,那么重载怎么会涉及到多态呢?
运行时与编译时行为是多态的核心,它与方法重载无关。
https://stackoverflow.com/questions/5491944
复制相似问题