【发布时间】:2010-10-23 21:51:39
【问题描述】:
多态是重载的另一种说法吗?
【问题讨论】:
-
我认为这个有更好的答案:)
-
理论上重载是一种多态性
标签: polymorphism overloading terminology
多态是重载的另一种说法吗?
【问题讨论】:
标签: polymorphism overloading terminology
没有;重载是用不同数量的参数创建一个具有相同名称的方法,或者使用其他类型的参数。
多态性是指跨各种类型(都具有相同的“基本类型”)更改特定方法的实现/功能。
重载:
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");
}
}
【讨论】:
base 类定义为abstract。
多态和方法重载的区别在于确定实际执行方法的时间。这样做的原因是当一个方法被重载的时候,比如在:
account = new BankAccount();
account = new BankAccount(1000);
编译器可以通过方法签名告诉使用哪个构造函数,包括提供的参数的数量和类型。在程序运行之前,在编译时选择使用的方法称为早期绑定。 另一方面,当我们使用诸如 x.getMeasure() 之类的多态方法调用时,实际调用的 getMeasure() 方法取决于 x 所指的对象类型。因为在程序运行之前不会构造对象,所以调用的方法是在运行时确定的。因此,虚拟机,而不是编译器选择了合适的方法。这种方法选择称为后期绑定。
【讨论】:
没有。
Polymorphism 是一种编程语言功能,允许使用统一接口处理不同数据类型的值。参数多态性的概念适用于数据类型和函数。可以计算或应用于不同类型值的函数称为多态函数。看起来是通用类型的数据类型(例如,具有任意类型元素的列表)被指定为多态数据类型,就像进行这种专门化的通用类型一样。
Method overloading 是各种编程语言(如 Ada、C#、C++、D 和 Java)中的一项功能,允许创建多个名称相同但术语不同的方法函数的输入类型和输出类型。
方法重载不应与类型多态性或虚函数相混淆。其中,在运行时选择正确的方法。
来源:维基百科。
【讨论】:
不,不是。
重载是指创建具有相同名称但参数不同以及(取决于语言)不同返回类型的方法或运算符。
重写是指在派生类中重新实现具有相同签名的方法并启用多态性 - 在运行时根据对象的实际类型决定要调用的重写方法的实现方式.
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");
【讨论】: