首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >编译时多态性/重载

编译时多态性/重载
EN

Stack Overflow用户
提问于 2011-03-31 04:27:02
回答 5查看 3.1K关注 0票数 2

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

多态对我来说意味着多个表单,我不太明白重载如何帮助实现这一点。

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2011-03-31 04:28:41

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

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

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

从根本上说,多态性是在同一API下处理多个类型的能力。所以从技术上讲,方法重载确实属于这一类。事实上,根据wikipedia的说法,方法重载被称为“即席多态”,但我在现实生活中从未听说过这个术语(并不是说我是最终权威)。通常是指方法的动态绑定,例如Shape,Circle,Square示例。

还有“参数多态性”,尽管根据我有限的经验,这通常被称为泛型或模板,这取决于语言(它们是不一样的();两者之间有细微的差异)

票数 7
EN

Stack Overflow用户

发布于 2011-03-31 04:30:28

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

事实并非如此。这是不正确的信息。重载不是多态性。从Wikipedia's Polymorphism in object-oriented programming页面:

方法重载和方法重载本身都不是多态性的实现。

票数 2
EN

Stack Overflow用户

发布于 2011-03-31 04:36:22

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

更新

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

是的,有。

在C#中,通过赋予多个方法相同的名称,方法重载是传达意图和避免讨厌的方法名称的一种便捷方法。但是假设一下,C#没有方法重载。假设一个方法的签名完全由它的名称组成,忽略参数类型。在这种假设的语言中会失去什么?

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

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

因此,如果语言的表达能力和编译后的代码在C#和无重载的C#中是相同的,那么重载怎么可能被认为是“多态性”呢?多态性意味着根据对象的类型表现出不同的行为。如果移除重载并不能改变对象的行为,那么重载怎么会涉及到多态呢?

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5491944

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档