方法重载是不是被认为是多态性? [关闭]

Posted

技术标签:

【中文标题】方法重载是不是被认为是多态性? [关闭]【英文标题】:Is Method Overloading considered polymorphism? [closed]方法重载是否被认为是多态性? [关闭] 【发布时间】:2011-01-24 21:50:56 【问题描述】:

方法重载是否被认为是多态性的一部分?

【问题讨论】:

这个问题是discussed on Meta,有些人决定关闭为基于意见,好像“多态性”没有明确的定义(也被接受的答案声称)。这是错误的,所以我投票重新开放。 current Polymorphism entry in Wikipedia 很好,与 Pierce “类型和编程语言”、Cardelli & Wegner “关于理解类型、数据抽象和多态性”以及 Strachey “编程语言中的基本概念”中的学术定义相匹配。 在 Java 中,根据 Kathy Sierra 的书,在第 2 章的 Drills 部分中指出“多态性仅适用于覆盖,而不适用于重载” 【参考方案1】:

There are different types of polymorphism:

重载多态性(也称为 Ad-hoc 多态性) 覆盖多态性

所以是的,它是多态性的一部分。

【讨论】:

你需要提一下,“本节的事实准确性存在争议”,所以据我所知,还没有说 100% 的重载是多态性。 @FractalizeR 也许您的理解仅限于面向对象语言中的运行时多态性,而不是一般术语 我只是在这里引用***;) @FractalizeR:Strachey 定义了 Darin 所说的内容。该部分的该部分实际上没有争议。 (至少,不是任何真正阅读过源文件的人。) 但是我在“Head First Java”(第 2 版)中看到,“重载方法不涉及多态性!” ...... :/【参考方案2】:

“多态”只是一个词,并没有全球公认的精确定义。您不会被您的问题的“是”或“否”答案所启发,因为差异将在于“多态性”的选择定义,而不是作为任何特定语言的特征的方法重载的本质。您可以在此处的大多数其他答案中看到这一点的证据,每个答案都引入了自己的定义,然后根据它评估语言特征。

【讨论】:

这是在我的采访中被问到的。 '解释多态性(在 Java 中)'。现在,我应该提到重载吗? 在Java中,“多态”指的是“运行时多态”,意思是动态的方法分派。重载不被认为是多态性的一个例子;事实上,Java 使用 方法签名 的概念,包括它的名称以及它的参数类型。当你这样看时,共享名称的两个方法“只是巧合”。【参考方案3】:

严格来说是多态性,来自wikipedia:

是一种类型 A 像另一种类型 B 一样出现和使用的能力。

因此,方法重载本身不被视为此定义多态性的一部分,因为重载被定义为一种类型的一部分。

如果您谈论的是包含多态性(通常被认为是覆盖),那是另一回事,然后,是的,它被认为是多态性的一部分。

包含多态性是类型论中的一个概念,其中一个名称可以表示许多不同类的实例,只要它们与某个公共超类相关。

【讨论】:

【参考方案4】:

有两种类型的多态性。

    静态 动态。

重载属于静态多态性..覆盖属于动态(或运行时)多态性..

参考。 http://en.wikipedia.org/wiki/Polymorphism_(computer_science) 描述得更多。

【讨论】:

【参考方案5】:

不,重载不是。也许你指的是method overriding,这确实是多态的一部分。

为了进一步澄清,来自***:

多态不等同于方法 重载或方法覆盖。1 多态性只关心 具体应用 实现接口或 更通用的基类。

所以我会说方法覆盖和方法重载以及某些语言关于多态性的便利特性,但不是多态性的主要关注点(在面向对象编程中),它只考虑一个对象的能力,就好像它是另一个对象一样在其层次结构链中。

【讨论】:

查看itu.dk/courses/BPRD/E2009/fundamental-1967.pdf 了解为什么这是错误的。 请参阅lucacardelli.name/Papers/OnUnderstanding.A4.pdf(特别是第 1.3 节),以便更容易理解为什么这是错误的。 ***不可靠......你应该总是去来源。 @GrijeshChauhan 不适用的文章:“你应该使用还是引用*** ->>> 作为学术论文的来源 @GrijeshChauhan 这就是所说的。但是引用了一篇不适用的文章,因为 SO 答案不是学术论文。【参考方案6】:

方法覆盖或重载不是多态性。 正确的说法是,多态可以通过方法覆盖或重载以及其他方式来实现。

为了使用方法重写来实现多态性,您可以在子类中重写方法的行为。

为了使用方法重载来实现多态性,你需要编写许多具有相同名称和相同数量参数但具有不同数据类型的方法,并在这些方法中实现不同的行为。这也是多态性。

实现多态的其他方法是运算符重载和实现接口。

【讨论】:

【参考方案7】:

除了 Wikipedia 学究之外,考虑多态性的一种方法是:单行代码/单个方法调用在运行时执行不同操作的能力,具体取决于用于进行调用的对象实例的类型。

方法重载不会改变运行时的行为。当您编写和编译代码时,重载为您提供了更多选择相同方法名称的参数列表,但是当它被编译时,选择在代码中永远是固定的。

不要与方法覆盖混淆,它是多态性的一部分。

【讨论】:

这是多态性的一个狭义定义;有一些定义表明它不仅仅是运行时行为。 (无论哪种方式,也可以考虑像 Groovy 这样的语言,其中重载在运行时解决。)【参考方案8】:

这是一种必要的邪恶,只能作为补充。最后重载应该只转换并最终转发到 main 方法。 OverloDing 是必要的,因为大多数静态调度环境的 vm 不知道如何将一种类型转换为另一种类型,因此参数适合目标,这就是使用重载来提供帮助的地方。

 StringBuilder
     Append(String) // main
     Append(Boolean) // converts and calls append(String)

【讨论】:

请回答问题,而不是评论一般主题。另外,请检查您的拼写。

以上是关于方法重载是不是被认为是多态性? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

构造器内部的多态行为

详细说明:方法重载是静态/编译时绑定,但不是多态性。将静态绑定与多态性相关联是不是正确?

重载和重写有啥区别

重写和重载的区别

Java中重载(Overload)和重写(Override)的定义

Java之方法重写方法重载多态