Posted on 2007-09-06 23:35
Ninety-Nine 阅读(23)
评论(0) 编辑 收藏 网摘 所属分类:
C#相关 <!--<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"xmlns:dc="http://purl.org/dc/elements/1.1/"xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/"><rdf:Descriptionrdf:about="http://www.cnblogs.com/ninetynine/archive/2007/09/06/884998.html"dc:identifier="http://www.cnblogs.com/ninetynine/archive/2007/09/06/884998.html"dc:title="C# 多态"trackback:ping="http://www.cnblogs.com/ninetynine/services/trackbacks/884998.aspx" /></rdf:RDF>-->
多态是面向对象编程中三大机制之一,其原理建立在"从父类继承而来的子类可以转换为其父类"这个规则之上,换句话说,能用父类的地方,就能用该类的子类.当从父类派生了很多子类时,由于每个子类都有其不同的代码实现,所以当用父类来引用这些子类时,同样的操作而可以表现出不同的操作结果,这就是所谓的多态.
1.了解什么是多态性
2.如何定义一个虚方法
3.如何重载一个虚方法
4.如何在程序中运用多态性
面向对象程序设计中的另外一个重要概念是多态性。在运行时,可以通过指向基类的指针,来调用实现派生类中的方法。 可以把一组对象放到一个数组中,然后调用它们的方法,在这种场合下,多态性作用就体现出来了,这些对象不必是相同类型的对象。当然,如果它们都继承自某个类,你可以把这些派生类,都放到一个数组中。 如果这些对象都有同名方法,就可以调用每个对象的同名方法。本节课将向你介绍如何完成这些事情。
1.清单9-1. 带有虚方法的基类:DrawingObject.cs
using System;
public class DrawingObject
{
public virtual void Draw()
{
Console.WriteLine("I'm just a generic drawing object.");
}
}
说明
清单9-1 定义了DrawingObject类。这是个可以让其他对象继承的基类。该类有一个名为Draw()的方法。Draw()方法带有一个virtual修饰符,该修饰符表明:该基类的派生类可以重载该方法。DrawingObject类的 Draw()方法完成如下事情:输出语句"I'm just a generic drawing object."到控制台。
2.清单9-2. 带有重载方法的派生类:Line.cs, Circle.cs, and Square.cs
using System;
public class Line : DrawingObject
{
public override void Draw()
{
Console.WriteLine("I'm a Line.");
}
}
public class Circle : DrawingObject
{
public override void Draw()
{
Console.WriteLine("I'm a Circle.");
}
}
public class Square : DrawingObject
{
public override void Draw()
{
Console.WriteLine("I'm a Square.");
}
}
说明
清单9-2定义了三个类。这三个类都派生自DrawingObject类。每个类都有一个同名Draw()方法,这些Draw()方法中的每一个都有一个重载修饰符。重载修饰符可让该方法在运行时重载其基类的虚方法,实现这个功能的条件是:通过基类类型的指针变量来引用该类。
3.清单9-3. 实现多态性的程序:DrawDemo.cs
using System;
public class DrawDemo
{
public static int Main(string[] args)
{
DrawingObject[] dObj = new DrawingObject[4];
dObj[0] = new Line();
dObj[1] = new Circle();
dObj[2] = new Square();
dObj[3] = new DrawingObject();
foreach (DrawingObject drawObj in dObj)
{
drawObj.Draw();
}
return 0;
}
}
说明
清单9-3演示了多态性的实现,该程序使用了在清单 9-1 和清单9-2中定义的类。在DrawDemo类中的Main()方法中,创建了一个数组, 数组元素是DrawingObject 类的对象。该数组名为dObj,是由四个DrawingObject类型的对象组成。
接下来, 初始化dObj数组, 由于Line, Circle和Square类都是DrawingObject类的派生类,所以这些类可以作为dObj数组元素的类型。 如果C#没有这种功能,你得为每个类创建一个数组。继承的性质可以让派生对象当作基类成员一样用,这样就节省了编程工作量。
一旦数组初始化之后,接着是执行foreach循环,寻找数组中的每个元素。在每次循环中, dObj 数组的每个元素(对象)调用其Draw()方法。多态性体现在:在运行时,各自调用每个对象的Draw()方法。尽管dObj 数组中的引用对象类型是DrawingObject,这并不影响派生类重载DrawingObject 类的虚方法Draw()。 在dObj 数组中,通过指向DrawingObject 基类的指针来调用派生类中的重载的Draw()方法。
输出结果是:
I'm a Line.
I'm a Circle.
I'm a Square.
I'm just a generic drawing object.
在DrawDemo 程序中,调用了每个派生类的重载的Draw()方法。 最后一行中,执行的是DrawingObject类的虚方法Draw()。这是因为运行到最后,数组的第四个元素是DrawingObject类的对象。
小结
现在对多态性有所了解之后,你可以在派生类中,实现一个重载基类虚方法的方法。虚方法和重载的派生类方法之间的关系就体现出C#的多态性。
相关推荐
C#多态测试C#多态测试C#多态测试C#多态测试C#多态测试
c#多态 完全 通 源码
这是一个应用多态的范例,以规范的代码实现了“统一调用,多种实现”
C#多态技术及简单例子描述 描述性文字为主,加简单例子
VS2010 C# 多态实例 适合初选者
c#初学者了解学习,大家对多态总是似懂非懂,没能好好的理解,做了一个关于多态的小案例
C# 中 多态概念,不同对象对于同一个方法实现不同的效果
C#多态学习源码,vs2010编辑,直接添加或者拷贝源代码即可运行。C#中多态的理解参考博文:http://blog.csdn.net/zxcvbnm32123/article/details/9385931
精品专题课件(2021-2022年收藏)
C#多态演示例子 QQ:292258449
C#多态.pdfC#多态.pdfC#多态.pdf
C#多态三种实现方式
详细讲解C#多态,完整概念+代码示例,亲自编写绝对正确,适合初学者,进阶人群谨慎下载!!!O(∩_∩)O哈哈~!!!
C#多态特性小练习(person类、animal类、wolf类、lion类)
课件文档中详解了C#多态的含义以及运用,列举了多个代码案例,能使初学者更好理解并学会使用多态
C# 多态 抽象类继承的武器场景示例 接口实现的开火场景示例 虚方法的武器场景示例
主要介绍了对C# 多态的理解,帮助大家更好的理解和学习c#,感兴趣的朋友可以了解下
c# 初学者必需掌握的 多态,接口,线程,重载等等
一、什么是多态 可以把一组对象放到一个数组中,然后调用它们的方法,在这种场合下,多态性作用就体现出来了,这些对象不必是相同类型的对象。当然,如果它们都继承自某个类,你可以把这些派生类,都放到一个数组中...
C#面向对象编程-多态习题[整理].pdf