《第10章 面向对象编程多态.ppt》由会员分享,可在线阅读,更多相关《第10章 面向对象编程多态.ppt(21页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、软件学院软件学院目目 录录第1章 计算机、因特网、万维网和C#第2章 Visual Studio.NET集成开发环境第3章 C#编程介绍第4章 控制结构(一)第5章 控制结构(二)第6章 方法第7章 数组第8章 基于对象的编程第9章 面向对象编程:继承第10章 面向对象编程:多态性第11章 异常处理第12章 图形用户界面概念(一)第13章 图形用户界面概念(二)第14章 多线程第15章 字符、字符串和正则表达式第16章 图形和多媒体第17章 文件和流第18章 数据库、SQL和ADO.NET第19章 可扩展标记语言(XML)第20章 ASP.NET、Web窗体和Web控件第21章 ASP.NET
2、和Web服务第22章 网络:基于流的套接字和数据包第23章 数据结构和集合第24章 可访问性v第一部分第一部分 .NET综述综述v第二部分第二部分 结构化编程结构化编程v第三部分第三部分 面向对象编程面向对象编程v第四部分第四部分 C#相关应用相关应用v第五部分第五部分 C#应用扩展应用扩展软件学院软件学院第第第第1010章章章章 面向对象编程:多态性面向对象编程:多态性面向对象编程:多态性面向对象编程:多态性软件学院软件学院10.1 概述概述继承和多态都是开发复杂软件时要用到的重要技术。多态性能让我们编写出以常规方式来处理的大量相关类,并简化了向系统添加新的类和功能。有了多态性,就能设计和实
3、现更容易扩展的系统。多态性定义软件学院软件学院派生类对象可以被视为基类对象来处理派生类对象可以被视为基类对象来处理如果基类引用引用了一个派生类对象,就可以将这个基类引用转换为该对象实际的数据类型,并将该对象作为这种实际的数据类型来处理。引用在程序中的体现是引用在程序中的体现是“=”请看代码代码演示了如何将派生类对象分配给基类引用,然后通过强制类型转换,将基类引用转换为派生类引用。10.2 派生类对象转换为基类对象派生类对象转换为基类对象软件学院软件学院第21行代码将circle1(一个派生类对象的引用)分配给point2(一个基类的对象的引用)。在C#中,由于继承是“属于”关系,所以可以将一个
4、派生类对象分配给一个基类对象。反之则很危险。第23、24行中,当C#碰到一个virtual(虚拟)方法调用(如ToString方法)时,它会根据被调用方法的对象类型(而不是引用该对象的引用类型)来判断被调用方法的版本。本例中,point2引用了一个Cricle对象,所以C#调用了Circle的ToString方法,而不是Point的ToString方法。这个调用哪个方法的判断便是多态性多态性的一个例子。软件学院软件学院static void Main(string args)Point point1=new Point(30,50);Circle circle1=new Circle(120,
5、89,2.7);Point point2=circle1;/1、基类引用派生类对象、基类引用派生类对象output+=point2.ToString();/访问的是访问的是Circle类的类的ToString方法方法Circle circle2=(Circle)point2;/2、基类引用可以转换为派生类引用、基类引用可以转换为派生类引用if(point1 is Circle)/判断左操作符类型是否与右操作符一致判断左操作符类型是否与右操作符一致 circle2=(Circle)point1;/无法将基类对象直接转化为派生类对象无法将基类对象直接转化为派生类对象部分代码部分代码软件学院软件学院
6、基类引用和派生类引用与基类对象和派生类对象有4种组合方式:1、用基类引用来引用基类对象;2、用派生类引用来引用派生类对象;3、用基类引用来引用派生类对象;4、用派生类引用无法直接引用基类对象。需要的过程为:首先定义基类引用来引用派生类对象,然后将基类引用转换为派生类引用。软件学院软件学院对于大型程序中的对象,判断其类型的方法之一式使用switch结构。但是,使用switch逻辑会使程序面临各种各样的问题。多态性编程可以消除不必要的多态性编程可以消除不必要的switch逻辑。使用逻辑。使用C#的多态性机的多态性机制来执行对应的逻辑,程序员可以避免与制来执行对应的逻辑,程序员可以避免与switch
7、逻辑相关的常见错误。逻辑相关的常见错误。10.3 类型字段和类型字段和switch语句语句软件学院软件学院10.4 多态性示例多态性示例SpaceObjectDrawYourself()PlutonianDrawYourself()VenutianDrawYourself()SpaceShipDrawYourself()LaserBeamDrawYourself()MartianDrawYourself()软件学院软件学院定义从没有打算实例化任何对象的类,称为抽象类抽象类。通常作为基类,一般称为抽象基类抽象基类。抽象类通常包含一个或多个抽象方法抽象方法或者抽象属性抽象属性。对类而言,如果对象可
8、以从它那里被实例化,可以把这样的类称为具体类具体类。10.5 抽象类和方法抽象类和方法软件学院软件学院关键字abstract用于将方法和属性声明为抽象。被声明为abstract的方法和属性不会提供实现部分试图这样做是语法错误。每个具体的派生类都必须覆盖基类的所有抽象方法和属性(利用关键字override),并提供这些方法和属性的具体实现部分。其中包含抽象方法的任何类都必须被声明为abstract。软件学院软件学院抽象方法和虚拟方法的区别在于:虚拟方法有一个实现部分,并为派生类提供了覆盖该方法的选项;虚拟方法有一个实现部分,并为派生类提供了覆盖该方法的选项;相反,抽象方法没有提供实现部分,强制派
9、生类覆盖方法(否则相反,抽象方法没有提供实现部分,强制派生类覆盖方法(否则派生类不能成为具体类)。派生类不能成为具体类)。多态性特别适用于实现分层式软件系统。在面向对象的编程中,定义一个能遍历容器(如一个数组)内所有对象的迭代器类是很常见的。迭代器迭代器通常用于多态性编程。软件学院软件学院10.6 示例(一):接口和实现的继承示例(一):接口和实现的继承ShapePoint2Circle2Cylinder2软件学院软件学院关键字sealed(密封)适用于方法和类,目的是防止被覆盖和继承。声明为sealed的方法不能在派生类中被覆盖。声明为static的方法和声明为private的方法都是隐式的
10、密封方法。使用密封类对运行时的性能略有提升。10.7 密封的类和方法密封的类和方法软件学院软件学院10.8 示例(二):使用多态性的工资发放系统示例(二):使用多态性的工资发放系统EmployeeBossCommissionwrokerPieceWorkerHourlyWorker软件学院软件学院接口适用于没有可继承的实现时(也就是没有示例变量和默认的方法实现时)。抽象类最好用于继承关系中的对象提供数据和服务,接口则用于提供这样的服务,这些服务将完全不同的、仅通过那个接口而关联的各个对象集合在一起。对于完全不同的类的对象,接口为它们提供了统一的方法和属性集。利用这些方法和属性,程序可以多态地处
11、理这些完全不同的类的对象。10.9 示例(三):创建和使用接口示例(三):创建和使用接口软件学院软件学院IAgePersonTree软件学院软件学院IShapePoint3Circle3Cylinder3软件学院软件学院有些时候,对象有必要将方法作为参数方法作为参数传给其他方法。C#不允许将方法引用作为参数直接传给其他方法,但它提供了封装有一系列方法引用的特殊类,名为委托委托。包含方法引用的委托对象可传给另一个方法。此时,不是直接发送一个方法引用。相反,对象是发送委托实例,其中包含了我们希望发送的方法引用。然后,接收委托引用的方法可调用委托中包含的方法。10.11 委托委托软件学院软件学院SingleCast(Delegate类)、类)、MultiCast(MulticastDelegate类)类)要使用委托,首先必须声明一个。在委托的声明中,指定一个方法头(参数及返回值)。如方法引用要包含一个委托对象中,该方法必须拥有与委托声明中定义相同的方法头。然后,就可创建拥有这个签名的方法。第二步是创建一个委托实例,其中包含对那个方法的一个引用。创建好委托实例后,可调用其中包含的方法引用。软件学院软件学院运算符重载:C#的运算符和类对象配合使用。C#允许程序员重载大多数运算符,使其在当前的使用场景下具有特定意义。10.12 运算符重载运算符重载
限制150内