多态性是重载的另一个术语吗?
yogogo
问问题
22941 次
4 回答
43
不; 重载是使用不同数量的参数或具有其他类型的参数创建具有相同名称的方法。
多态性是关于跨各种类型(都具有相同的“基本类型”)更改特定方法的实现/功能。
重载:
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");
}
}
于 2009-05-05T13:06:21.390 回答
10
多态性和方法重载之间的区别在于确定要执行的实际方法的时间。这样做的原因是当方法被重载时,例如:
account = new BankAccount();
account = new BankAccount(1000);
编译器可以通过方法签名来判断使用哪个构造函数,包括提供的参数的数量和类型。在程序运行之前,在编译时选择使用的方法称为早期绑定。另一方面,当我们使用诸如 x.getMeasure() 之类的多态方法调用时,实际调用的 getMeasure() 方法取决于 x 所指的对象类型。因为在程序运行之前不会构造对象,所以调用的方法是在运行时确定的。因此,虚拟机,而不是编译器选择了合适的方法。这种方法选择称为后期绑定。
于 2009-05-05T13:08:35.690 回答
1
不它不是。
重载是指创建具有相同名称但参数不同的方法或运算符,并且 - 根据语言 - 不同的返回类型。
覆盖是指在派生类中重新实现具有相同签名的方法并启用多态性 - 在运行时根据对象的实际类型决定要调用的覆盖方法的实现。
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");
于 2009-05-05T13:13:54.600 回答