C# 多态
来源:互联网 发布:大数据行业人才需求 编辑:程序博客网 时间:2024/04/30 01:07
最近在学习设计模式,于是在看《大话设计》附录的时候发现了一个在面向对象中非常常见的一个词‘多态’, 不懂,于是百度了一下,更晕了,因为百度上是这样说的多态:同一操作作用于不同的对象,可以有不同的解释,产生不同的执行结果。在运行时,可以通过指向基类的指针,来调用实现派生类中的方法。
多态的概念:
运行时的多态性:运行时多态性又称动态多态性,就是确定消息的多态响应的联编操作不是在编译连接的过程中完成的,而是在程序程序运行中才能完成的。这种联编称为动态联编或后期联编。它是面向对象的程序设计。
编译时的多态性
编译时的多态性是通过重载来实现的。对于非虚的成员来说,系统在编译时,根据传递的参数、返回的类型等信息决定实现何种操作。
比较
一个是动态的,一个是静态的,静态的就是指函数的重载而已,实现方法是根据函数的名字不同来调用的,而运行多态是我们常说的多态,他的实现方法是更加一个虚函数表里维护的,他需要继承,虚函数,指针,子类重写父类的虚函数才能实现多态。编译时的多态性为我们提供了运行速度快的特点,而运行时的多态性则带来了高度灵活和抽象的特点。
多态性是类伪方法(这些方法以相同的名称调用)提供不同实现方式的能力。多态性允许对类的某个方法进行调用而无需考虑该方法所提供的特定实现。例 如,可能有名为 Animal的类,它调用另一个类的 shout() 方法。这另一个类 可能是 Cat或Dog,但二者都提供 shout() 方法。虽然shout()方法的实现因类的不同而异,但 Road 类仍可以调用它,并且它提供的结果可由 Animal类使用和解释。Animal的shout()就是伪方法,而Cat的和Dog的shout()为真实的功能,也就是实体。
多态的实现
通过抽象类实现的多态性
抽象类同时提供继承和接口的元素。抽象类本身不能实例化,它必须被继承。该类的部分或全部成员可能未实现,该实现由继承类提供。已实现的成员仍可被重写,并且继承类仍可以实现附加接口或其他功能。
实例
父类:
class DrawBase { public virtual void Draw() { Console.WriteLine("这是一个虚方法"); } }
子类:
class Line : DrawBase //画直线 { public override void Draw() { Console.WriteLine("I'm a Line."); } } class Circle : DrawBase //画圆 { public override void Draw() { Console.WriteLine("I'm a Circle."); } } class Square : DrawBase //画正方形 { public override void Draw() { Console.WriteLine("I'm a Square."); } }
main函数
class Program { static void Main(string[] args) { DrawBase[] dObj = new DrawBase[4]; dObj[0] = new Line(); dObj[1] = new Circle(); dObj[2] = new Square(); dObj[3] = new DrawBase(); foreach (DrawBase drawObj in dObj) drawObj.Draw(); Console.ReadLine(); } }创建了一个数组,数组元素是DrawBase类的对象。该数组名为dObj,是由四个DrawBase类型的对象组成。接下来,初始化dObj数组,由于Line,Circle和Square类都是DrawBase类的派生类,所以这些类可以作为dObj数组元素的类型。
那么输出结果便是
在C#编程中,可以说没有多态就没有面向对象,特别是运行时多态,为程序的扩展提供了切入点.没有多态就没有框架设计,也就没有.net framework.所有的设计模式也都是基于多态特性来实现.尤其是一些小的编程,多态的作用更是拥有好的效果
- C#多态
- c# 多态
- c#多态
- C# 多态
- C#多态
- c#多态
- C# 多态
- C# 多态
- C# 多态
- C#多态
- C#多态
- C#多态
- C# 多态
- C#多态
- C# 多态
- C# 多态
- C# 多态
- c#多态
- raywenderlich
- Light Probes (Pro only)
- android Data call disable(移动网络--关闭数据业务部分)
- 锋利的jQuery笔记(八)
- EditText的属性介绍
- C# 多态
- linux下批量替换文件内容
- 双杀
- @ManyToOne @OneToMany
- java的可序列化(转载)
- Android Wear 所谓的亮点和实际真相
- linux下无法访问硬盘
- Cocos2d-x vs2012 简单入门笔记
- java中volatile关键字的含义