用对象思考讲解材料

上传人:yulij****0329 文档编号:137241814 上传时间:2020-07-06 格式:PPT 页数:38 大小:708KB
返回 下载 相关 举报
用对象思考讲解材料_第1页
第1页 / 共38页
用对象思考讲解材料_第2页
第2页 / 共38页
用对象思考讲解材料_第3页
第3页 / 共38页
用对象思考讲解材料_第4页
第4页 / 共38页
用对象思考讲解材料_第5页
第5页 / 共38页
点击查看更多>>
资源描述

《用对象思考讲解材料》由会员分享,可在线阅读,更多相关《用对象思考讲解材料(38页珍藏版)》请在金锄头文库上搜索。

1、第7章 用对象思考,在前一章,学习了.NET中的类和对象,也会用面向对象的思想来编写程序了。在面向对象编程中经常会遇到对象与对象之间消息的传递。其实在现实世界中我们发现对象之间存在更多的关系,如亲人关系、朋友关系等。在OOP中,同样需要对象之间建立关系,实现更多通信。本章将深入OOP编程,深入学习面向对象编程的更多特性。本章主要涉及到的知识点有: 继承:实现代码的复用,建立类的层次关系。 多态:理解多态原理,用抽象类和抽象方法实现多态。 接口:理解接口的定义以及应用。 了解序列化和反序列化,程序集和反射。 了解C#面向对象特性,学会使用索引、委托和事件。,7.1 用对象思考:继承,现实中存在着

2、各种继承关系,比如动物与猫的关系、轿车与车的关系。在面向对象编程中也存在“继承”的概念,C#能够利用继承的强大机制,在面向对象编程中更好的模拟现实世界,实现更复杂的面向对象描述,实现软件中的代码复用。,7.1.1 解决代码的冗余,【本节示例参考:源代码chapter77.1.1InheritExample】 在完成一个信息管理系统的时候,笔者把系统的使用者分为两类,一般用户和管理员,他们具有不同的权限。通过类图对比一下这两个类,如图7.1所示。 可以看到,User类和Admin类都具有相同的属性Id和Name,具有相同的方法SayHi。也就是说对于系统的使用者,两个类都具有一些相同的状态和行为

3、。考虑到系统的扩展性,以后系统的使用者角色可能会更多,这会编写大量重复的代码,造成冗余。为了解决这个问题,下面重新创建一个新类Person,用于保存User类和Admin类公共的属性和方法,如图7.2所示。实现三个类的关系的程序如代码7-1所示。,7.1.2 建立继承模型,【本节示例参考:源代码chapter7 7.1.2InheritExample】 在面向对象编程中,什么是继承呢?在现实世界中,继承关系是到处存在的,如用户和管理员都是人,他们都具有人的共同特性;猫和狗都是动物,都具有动物的共同特性。我们把现实中可以通过“is a”描述的关系,称作继承关系。即“管理员是人(Admin is

4、a Person)”,“狗是动物(dog is animal)”。 C#中是如何实现继承的呢?通过“:”运算符。在声明类时,在类名称后放置一个冒号,然后在冒号后指定要从中继承的类(即基类)。例如下面的定义的类实现了“管理员是人”的关系: public class Person /Person类成员 public class Admin : Person /Admin类成员 ,7.1.4 继承的特性,继承实现了类与类之间的层次关系,描述了更加丰富多彩的面向对象世界。同时,继承也具有一些特点需要了解。 (1)传递性 在信息管理系统中,用户分为一般用户和管理员,因为后台管理的需要,必须要有一个超级管

5、理员的角色来实现整个系统的管理。这样子,系统的用户关系图如图7.7所示。在程序中的继承关系如图7.8所示。 通过这种传递的关系,SuperAdmin不仅可以共享父类Admin的公共属性和方法,同时可以共享Person类的属性和方法。 (2)单根性 在上一节已经提到了,C#中的继承是单继承的,不支持多继承。 (3)密封性 在C#中可以通过关键字sealed来修饰一个类,这样的类是不能被继承的,这种类称为密封类。,7.1.5 继承的价值,【本节示例参考:源代码chapter77.1.5InheritExample】 继承模拟了现实世界中的关系,在OOP中强调一切皆对象,这符合面向对象的编程思想,同

6、时,继承实现了代码的重用,减轻了程序员编写代码的负担。继承使程序的结构更加清晰,使类与类之间的关系层次机构化,更易于维护。合理地使用继承,会对程序编写带来很大帮助。最后,通过一个综合例子来完成对继承的学习。请看下面的描述: 狗是哺乳动物。狗通常的时候和人打招呼会通过摇摇尾巴,在被抚摸感到舒服的时候,会旺旺叫,而在受到惊吓情绪烦躁时,会发出呜呜声。青蛙不是哺乳动物,属于卵生。当青蛙情绪好的时候,会在岸边呱呱呱的唱歌,而在受到惊吓时,会扑通一声跳入水中。,7.2 用对象思考:多态,在前面,学习了面向对象的封装和继承特性,通过封装保证了数据的安全性,通过继承实现了代码的重用。面向对象还有个非常重要的

7、概念,那就是多态。本章将通过多个例子来详细讲解多态的概念。,7.2.1 巧妙解决继承带来的问题,【本节示例参考:源代码chapter77.2.1AbstractExample】 在管理系统中,用户和管理员都需要通过登录才能进入系统,按照继承的原理,应该将登录的公共方法放到父类当中,如图7.10所示。,7.2.2 用抽象类和抽象方法实现多态,【本节示例参考:源代码chapter77.2.1MultistateExample】 上一节就是用抽象类和抽象方法实现了多态,当用户和管理员调用Login()方法的时候,他们的响应是不一样的,也就是说用户和管理员具有多态性。在基类Person中声明抽象方法L

8、ogin(),让它约束子类,必须实现不同的Login(),从而实现多态。 (1)抽象方法是一个没有方法体的方法,用关键字abstract修饰。语法如下: abstract 返回类型 方法名(); 方法被标记为抽象的,要求子类必须实现该方法;方法没有方法体(方法名括号后直接跟一个分号结束),提醒编译器注意,如果子类没有重写该抽象方法,就会报错。 注意:抽象方法没有闭合的大括号,下面的声明方式是错误的: abstract 返回类型 方法名() (2)含有抽象方法的类被称为抽象类,用关键字abstract修饰。语法如下: abstract class 类名 抽象类中并不一定都是抽象方法,抽象类中也可

9、以容纳具体实现的方法。但是,有抽象方法的类必然是抽象类。 (3)在子类中,通过关键字override重写抽象方法,语法如下: override返回类型 方法名(),7.2.3 使用虚方法实现多态,【本节示例参考:源代码chapter77.2.3VirtualExample】 继续上一节的实例,在用户信息管理系统中,父类(Person)定义一个登录的抽象方法Login()。要求子类去实现它。但是通常情况下,许多角色的用户登录系统的逻辑是一样的,只是管理员(Admin)的有所差别。 那么这个通用的登录方法应该放在哪里呢?按照上面的思想,应该放在父类里面。我们希望这样实现:“父类(Person)中的

10、Login()方法实现通用的登录逻辑,一般用户(User)默认采用父类的登录方法即可,管理员(Admin)可以把父类的登录方法重写,实现管理员特有的登录逻辑”。可以实现吗? C#中用virtual方法修饰的方法称为虚方法,虚方法可以有具体的实现,也可以被重写。在父类中定义虚方法,然后在子类中可以重写虚方法,也实现了面向对象的多态。虚方法的语法如下: virtual 返回类型 方法名() /方法体 ,7.2.4 面向对象的三大特性,到此为止,我们已经学习了面向对象中的三个重要特性:封装、继承、多态。现总结一下: (1)封装:保证对象自身数据的完整性、安全性。 (2)继承:建立类之间的关系,实现代

11、码重用,方便系统扩展。 (3)多态:相同的方法调用可实现不同的实现方式。,7.3 用对象思考:接口,在面向对象的编程系统中,系统的各种功能都是由许许多多的对象协作完成的。各个对象之间的协作关系成为了系统设计的关键,现在非常流行的面向接口编程实现的就是这种思想。本章将学习面向对象的接口技术。,7.3.1 接口的提出,面向对象中的接口概念,同样源于现实世界。在现实世界中,接口就是一套规范,满足这个规范的设备,就可以将它们组装到一起,从而实现设备的功能。例如,国际上定义了许多螺丝螺母的标准,根据这些标准就可以生产各种型号的螺母以及配套的螺丝,如图7.11、图7.12所示。满足标准的螺丝和螺母,可以用

12、于制造机床、改装汽车等,只要它们提供通用的接口。,7.3.2 接口的定义,【本节示例参考:源代码chapter77.3.2InterfaceExample】 在.NET中,接口同样是一种标准和规范,它可以约束类的行为,使不同的类能达到一个统一的规范。接口中可以包含字段、属性、方法和索引器等。但是接口中的属性和方法都不能实现。这好比是更加抽象的抽象类。接口用interface关键字声明,语法如下: public interface IPerson int Name /接口中的属性 get; set; void SayHi(); /接口中的方法 ,7.3.3 接口的实现,【本节示例参考:源代码ch

13、apter77.3.3InterfaceExample】 定义好接口以后,类就可以实现接口,实现接口的语法如下: class User : IPerson 如果一个类要继承一个父类,同时要实现多个接口,则以“,”号隔开,语法如下: class User : Person,IPerson,IComparable 下面,通过程序实例来学习接口。在用户管理信息系统中,要求每个用户登录,都要把登录的状态、时间写进日志。现定义一个接口ILog来完成写日志的操作,然后在User类和Admin类中分别实现这个接口。类之间的关系如图7.16所示。,7.4 老鼠的儿子会打洞,在7.2.1节,遗留了一个问题,泛型

14、集合List用于保存用户对象,为什么父类类型约束的泛型集合可以存储它的子类对象呢?原则上子类对象是可以赋给父类对象的,即子类可以完全替代父类,并且出现在父类能够出现的地方。但是反过来,父类对象是不能替换子类对象的。我们称这样的特性为“里氏替换原则(LSP)”,可以通俗地理解为“老鼠的儿子会打洞”。对于里氏替换原则有两个关键的技术,就是is操作符和as操作符。,7.4.1 is操作符,【本节示例参考:源代码chapter77.4.1IsExample】 is操作符用于检查对象是否与给定类型兼容,is英文单词的意思为“是”。可以用is来判断对象是否是给定的数据类型。例如下面的语法: if(obj

15、is Person) /执行相应的操作 定义下面这样一个程序结构,然后通过代码7-10,检查程序的结果。 abstract class Person /代码省略 class User : Person /代码省略 ,7.4.2 as操作符,【本节示例参考:源代码chapter77.4.2AsExample】 在讲as操作符之前,先了解一下强制类型转换。强制类型转换是通过“( )”运算符来实现的。如果转换不通过,则会引发异常。如图7.17演示了强制类型转换的用法。,7.5 序列化与反序列化,序列化是将对象的状态存储到特定存储介质中的过程,也可以说是将对象状态转换为可保持或传输的过程。当两个进程在

16、进行远程通信时,彼此可以发送各种类型的数据。无论是何种类型的数据,都会以二进制序列的形式在网络上传送。发送方需要把这个对象转换为字节序列,才能在网络上传送;接收方则需要把字节序列再恢复为对象。,7.5.1 序列化和反序列化的用途,对于一个Windows程序来说,配置文件是非常重要的,配置文件保存了系统的设置,用户可以通过采用修改配置信息的方式定制软件的特性和功能。如图7.18显示了Windows操作系统的壁纸显示设置。当设置好壁纸的显示信息以后,程序会根据用户的要求来显示壁纸。,7.5.2 序列化和反序列化操作,【本节示例参考:源代码chapter77.5.BinarySerializerExample】 .NET提供多种形式的序列化,文本、XML流等。目前使用二进制流方式对泛型支持得最好。二进制格式化器具有一个非常重要的方法:Serialize()。语法如下: public void Serizlize(String serializationStream, Object graph); 其中第一个参数指定序列化过程的文件流,第二个参数指

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 中学教育 > 教学课件 > 高中课件

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号