OOP面向对象的三个特性:封装、继承和多态。前面两个特性好理解,多态则常常搞得很多人头晕,网上的解释也是五花八门。
什么是多态?按百度百科的解释,多态(Polymorphism)按字面的意思就是“多种状态”。在面向对象语言中,接口的多种不同的实现方式即为多态。引用Charlie Calverts对多态的描述——多态性是允许你将父对象设置成为和一个或更多的他的子对象相等的技术,赋值之后,父对象就可以根据当前赋值给它的子对象的特性以不同的方式运作(摘自“Delphi4 编程技术内幕”)。简单的说,就是一句话:允许将子类类型的指针赋值给父类类型的指针。多态性在Object
Pascal和C++中都是通过虚函数(Virtual Function) 实现的。
我认为这种说法比较容易理解:多态是为了实现接口重用,说白了,就是父类引用指向子类的对象(即将子类赋值给父类),进行动态绑定,不同的子类有不同的实现。下面用常用比喻作一个例子(动物,叫声,不同动物发出的是不同的叫声)
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace Polymor
{
class Program
{
static void Main(string[] args)
{
Animal Animal = new Animal();
Animal dog = new dog(); //允许将子类类型的指针赋值给父类类型的指针。
Animal cat = new cat();
Animal cattle = new cattle();
Animal.sounds();
dog.sounds(); //接口重用
cat.sounds();
cattle.sounds();
Console.ReadKey();
}
}
class Animal
{
public virtual void sounds() //通过虚函数实现
{
Console.WriteLine("动物的叫声");
}
}
class dog : Animal
{
public override void sounds() //重写、覆盖
{
Console.WriteLine("狗的叫声:旺旺...");
}
}
class cat : Animal
{
public override void sounds()
{
Console.WriteLine("猫的叫声:喵喵...");
}
}
class cattle : Animal
{
public override void sounds()
{
Console.WriteLine("牛的叫声:哞哞...");
}
}
}
输出结果为
动物的叫声:
狗的叫声:旺旺...
猫的叫声:喵喵...
牛的叫声:哞哞...
我个人认为多态主要是三个特点:
1、重写(override)
2、通过虚函数实现
3、父类引用指向子类的对象
好吧,按我的理解,再简单点,奶奶的,不就是子类重写父类虚函数吗?!
一家之言,不当之处还望指教。