用一个例子说明什么是多态
2012-11-13 16:20
1046 查看
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、父类引用指向子类的对象
好吧,按我的理解,再简单点,奶奶的,不就是子类重写父类虚函数吗?!
一家之言,不当之处还望指教。
什么是多态?按百度百科的解释,多态(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、父类引用指向子类的对象
好吧,按我的理解,再简单点,奶奶的,不就是子类重写父类虚函数吗?!
一家之言,不当之处还望指教。
相关文章推荐
- 一个例子说明机器学习在做什么
- session.flush方法到底干了一些什么事情,举一个具体的例子说明
- 一个例子说明机器学习在做什么
- 数据结构和算法到底有什么用?一个例子说明。
- 通过一个有趣的例子说明线程的工作机制
- 举一个简单例子来说明:如何在JSP中使用JavaBean
- 简单说明什么是递归,什么情况下会使用递归,并写一个简单的递归程序。
- hibernate级联操 同时向2张表插入数据(一对多的关联,一个简单的例子说明)
- java中什么是线程安全给出一个例子
- 一个小例子对多态简单的理解
- 关于多态的一个很形象的例子
- 以一个最简单的例子把OO的JavaScript说明白
- 链接一个做水的例子(虽然什么解释都没有)
- D3的一个平移 缩放例子,说明基本用法
- stl(三)------这是一个MSDN中的一个关于map 中find函数的说明 很好的一个例子
- JS-原生/一个例子讲清楚什么是闭包,什么是内存销毁
- 一个Qt线程的例子,用于说明QWaitCondition的作用
- 一个例子说明FPGA中PLL的重要性
- 简单说明什么是递归,什么情况下会使用递归,并写一个简单的递归程序。
- .net中的对象序列化(1): 序列化是什么, 以及一个简单的例子