多态性是重载的另一个术语吗?

Posted

技术标签:

【中文标题】多态性是重载的另一个术语吗?【英文标题】:Is polymorphism another term for overloading? 【发布时间】:2010-10-23 21:51:39 【问题描述】:

多态是重载的另一种说法吗?

【问题讨论】:

这是一个密切相关的问题***.com/questions/673721/overloading-and-overriding 不是一个新问题***.com/questions/154577/… 或者这个***.com/questions/154577/… 我认为这个有更好的答案:) 理论上重载是一种多态性 【参考方案1】:

没有;重载是用不同数量的参数创建一个具有相同名称的方法,或者使用其他类型的参数。

多态性是指跨各种类型(都具有相同的“基本类型”)更改特定方法的实现/功能。

重载:

public class TestClass

    public void DoSomething( int a, int b ) 

    public void DoSomething( int a, int b, string x ) 

多态性:

public abstract class Base

    public abstract DoSomething();


public class A : Base

    public override DoSomething()
    
         Console.WriteLine("I am A");
    


public class B : Base

     public override DoSomething()
     
         Console.WriteLine("I am B");
     

【讨论】:

不一定是接口。一个通用的基类就足够了。 它可以通过接口以及基类或抽象类来完成。关键是对象的具体类型无关紧要。只需要与底座没有区别就可以使用底座;无论基地是什么。 可以是接口,可以是抽象类,也可以是普通基类。但请注意,该方法必须是“虚拟的”才能覆盖它。 根据您的多态示例@Frederik,您应该将base 类定义为abstract 或者更确切地说是临时多态性。【参考方案2】:

多态和方法重载的区别在于确定实际执行方法的时间。这样做的原因是当一个方法被重载的时候,比如在:

account = new BankAccount();
account = new BankAccount(1000);

编译器可以通过方法签名告诉使用哪个构造函数,包括提供的参数的数量和类型。在程序运行之前,在编译时选择使用的方法称为早期绑定。 另一方面,当我们使用诸如 x.getMeasure() 之类的多态方法调用时,实际调用的 getMeasure() 方法取决于 x 所指的对象类型。因为在程序运行之前不会构造对象,所以调用的方法是在运行时确定的。因此,虚拟机,而不是编译器选择了合适的方法。这种方法选择称为后期绑定。

【讨论】:

【参考方案3】:

没有。

Polymorphism 是一种编程语言功能,允许使用统一接口处理不同数据类型的值。参数多态性的概念适用于数据类型和函数。可以计算或应用于不同类型值的函数称为多态函数。看起来是通用类型的数据类型(例如,具有任意类型元素的列表)被指定为多态数据类型,就像进行这种专门化的通用类型一样。

Method overloading 是各种编程语言(如 Ada、C#、C++、D 和 Java)中的一项功能,允许创建多个名称相同但术语不同的方法函数的输入类型和输出类型。

方法重载不应与类型多态性或虚函数相混淆。其中,在运行时选择正确的方法。

来源:***。

【讨论】:

【参考方案4】:

不,不是。

重载是指创建具有相同名称但参数不同以及(取决于语言)不同返回类型的方法或运算符。

重写是指在派生类中重新实现具有相同签名的方法并启用多态性 - 在运行时根据对象的实际类型决定要调用的重写方法的实现方式.

class BaseClass

     public void DoStuff(Int32 value)   // Overloading

     public void DoStuff(String value)   // Overloading

     public virtual void DoOtherStuff(String value)  


class DerivedClass : BaseClass

    public override void DoOtherStuff(String value)   // Overriding

使用示例

BaseClass instance = null;

if (condition)

    instance = new BaseClass();

else

    instance = new DerivedClass();


// Using overloads
instance.DoStuff(4);
instance.DoStuff("four");

// Polymorphism - it depends on the actual type of the object
// referenced by the variable 'instance' if BaseClass.DoOtherStuff()
// or DerivedClass.DoOtherStuff() will be called at runtime.
instance.DoOtherStuff("other stuff");

【讨论】:

以上是关于多态性是重载的另一个术语吗?的主要内容,如果未能解决你的问题,请参考以下文章

C++ 多态性和重载?

java中重载,继承,重写和多态的区别

php 方法重写和多态的区别

封装继承重载重写多态

《编程导论(Java)·2.1.2 啊,我看到了多态》-什么是多态(polymorphism)

多态你真的了解吗?