C#程序设计及应用教程(WHUT课件)第5章 面向对象的高级编程.ppt
《C#程序设计及应用教程(WHUT课件)第5章 面向对象的高级编程.ppt》由会员分享,可在线阅读,更多相关《C#程序设计及应用教程(WHUT课件)第5章 面向对象的高级编程.ppt(40页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、1 1第第5 5章章 面向对象的高级编程面向对象的高级编程5.1类的的继承与多承与多态性性5.2版本控制版本控制5.3接口接口 5.4委托和事件委托和事件5.5反射反射5.6序列化与反序列化序列化与反序列化2 25.1 5.1 类的继承与多态性类的继承与多态性封装:封装:隐藏藏调用者不需要了解的信息。用者不需要了解的信息。继承:承:简化化类的的设计,为系系统维护提供便利。提供便利。多多态:类为名称相同的方法提供不同名称相同的方法提供不同实现方式的能力。方式的能力。3 35.1.1 5.1.1 基类和扩充类基类和扩充类继承表示承表示现实世界中世界中遗传关系的直接模关系的直接模拟。它表示它表示类之
2、之间的内在的内在联系以及系以及对属性和属性和操作的共享。操作的共享。4 45.1.1 5.1.1 基类和扩充类基类和扩充类OOL中中继承的两种承的两种实现方式方式:实现继承和接口承和接口继承承。被被继承的承的类叫基叫基类/父父类从基从基类继承来的承来的类叫叫扩充充类/派生派生类/子子类实现继承承:表示一个表示一个类型派生于一个基型派生于一个基类型,型,拥有有该基基类型的所有成型的所有成员字段和函数。在字段和函数。在实现继承中,派生承中,派生类型的每个函数采用基型的每个函数采用基类型的型的实现代代码,除非在派生,除非在派生类型的定型的定义中指定重写中指定重写该函数的函数的实现代代码。例如例如:S
3、ystem.Windows.Forms.TextBox和和System.Windows.Forms.ListBox派派生生于于System.Windows.Forms.Control,并重写了函数,或提供了新的函数,以并重写了函数,或提供了新的函数,以实现特定特定类型的控件。型的控件。接口接口继承承:表表示一个示一个类型只型只继承了函数的承了函数的签名,没有名,没有继承任何承任何实现代代码。C#中,中,实现继承只允承只允许单一一继承承,接口可,接口可实现多重多重继承承。因因为System.Object是一个公共的基是一个公共的基类,所以每个,所以每个C#类(除了除了Object类之外之外)都有
4、一个基都有一个基类,还可以可以有任意多个基接口。有任意多个基接口。5 55.1.1 5.1.1 基类和扩充类基类和扩充类声明声明扩充充类的的语法:法:访问修修饰符符class扩充充类名称名称:基:基类名称名称/程序代程序代码扩充充类继承了所有定承了所有定义在基在基类中数据的定中数据的定义和方法。但是和方法。但是扩充充类不不继承基承基类的构造函数的构造函数。注意注意:C#不支持私有不支持私有继承,因此基承,因此基类名上没有名上没有public或或private限定符限定符如果在如果在类定定义中没有指定基中没有指定基类,C#编译器就假定器就假定System.Object是基是基类。6 65.1.1
5、 5.1.1 基类和扩充类基类和扩充类【例例5-1】基基类和和扩充充类的定的定义及用法。及用法。7 75.1.2 5.1.2 多态性多态性多多态性性是指是指对象可以表示多个象可以表示多个类型的能力。型的能力。在在C#中,多中,多态性的定性的定义是:是:同一操作作用于不同的同一操作作用于不同的类的的实例例,不同的,不同的类将将进行不同的解行不同的解释,最后,最后产生不同的生不同的执行行结果果。3种种实现多多态性的方法:性的方法:通通过继承承实现多多态性。性。通通过抽象抽象类实现多多态性。性。通通过接口接口实现多多态性。性。8 85.1.2 5.1.2 多态性多态性1、虚、虚拟方法方法 在基在基类
6、中,如果想中,如果想让某个方法或者事件被某个方法或者事件被扩充充类重写,可重写,可以使用修以使用修饰符符virtual表明:表明:publicvirtualvoidmyMethod()/虚虚拟方法方法/程序代程序代码扩充充类则用用override重写重写:publicoverridevoidmyMethod()/程序代程序代码9 95.1.2 5.1.2 多态(续)多态(续)使用虚使用虚拟方法和重写方法方法和重写方法时,要注意下面几个方面:,要注意下面几个方面:虚虚拟方法不能声明方法不能声明为静静态的。的。virtual不能和不能和private一起使用。一起使用。重写方法的名称、参数个数、重
7、写方法的名称、参数个数、类型以及返回型以及返回值都必都必须和和虚虚拟方法的一致。方法的一致。10105.1.2 5.1.2 多态(续)多态(续)【例例5-2】重写基重写基类的方法。的方法。11115.1.2 5.1.2 多态(续)多态(续)2、隐藏基藏基类的方法的方法在在扩充充类中,可以使用中,可以使用new关关键字来字来隐藏基藏基类的方法,即使用一的方法,即使用一个完全不同的方法取代旧的方法。个完全不同的方法取代旧的方法。与方法重写不同的是,使用与方法重写不同的是,使用new关关键字字时并不要求基并不要求基类中的方法中的方法声明声明为virtual,只要在,只要在扩充充类的方法前声明的方法前
8、声明为new,就可以,就可以隐藏藏基基类的方法。的方法。classMyDerivedClass:HisBaseClasspublicnewintMyGroovyMethod()/somegroovyimplementationreturn0;【例例5-3】12125.1.2 5.1.2 多态(续)多态(续)3.在在扩充充类直接直接调用基用基类的方法的方法使用使用base关关键字字classCustomerAccountpublicvirtualdecimalCalculatePrice()/implementationreturn0.0M;classGoldAccount:CustomerAc
9、countpublicoverridedecimalCalculatePrice()returnbase.CalculatePrice()*0.9M;13135.1.3 5.1.3 抽象类抽象类使用使用abstract修修饰符。符。抽象抽象类只能做基只能做基类。抽象抽象类与非抽象与非抽象类的区的区别:第一是抽象第一是抽象类不能直接被不能直接被实例化,只能在例化,只能在扩充充类中通中通过继承承使用,使用,对抽象抽象类使用使用new运算符会运算符会产生生编译时错误。第二个不同点是抽象第二个不同点是抽象类可以包含抽象成可以包含抽象成员,而非抽象,而非抽象类不能不能包含抽象成包含抽象成员。当从抽象。当
10、从抽象类派生非抽象派生非抽象类时,这些非抽象些非抽象类必必须具体具体实现所所继承的所有抽象成承的所有抽象成员。1414publicabstractclassoneClasspublicinti;publicvoiddenylau()()i=10;publicabstractvoidmethod();();/抽象方法抽象方法,在抽象在抽象类中抽象方法不提供中抽象方法不提供实现。【例例5-4】15155.1.4 5.1.4 密封类密封类密封密封类是指不能被其他是指不能被其他类继承的承的类。在在C#语言中,使用言中,使用sealed关关键字声明密封字声明密封类。C#还提出了密封方法提出了密封方法(s
11、ealedmethod)的概的概念念.带有有sealed修修饰符的方法称符的方法称为密封方法密封方法,sealed关关键字也可以限制基字也可以限制基类中中的方法,防止被的方法,防止被扩充充类重写。重写。密封方法同密封方法同样不能被不能被扩充充类中的方法中的方法继承,也不能被承,也不能被隐藏。藏。publicabstractclassEmployeepublicvirtualvoidPay()publicabstractvoidCalculatePay();publicsealedclassHourlyEmployee:Employee/密封密封类publicsealedoverridevoid
12、Pay()/密封方法密封方法CalculatePay();publicoverridevoidCalculatePay()如果如果试图通通过使用下面的使用下面的语句从密封句从密封类继承:承:classMyDerivedC:HourlyEmployee/Error,将收到将收到错误信息信息:MyDerivedCcannotinheritfromsealedclassHourlyEmployee.16165.1.5 5.1.5 继承过程中构造函数的处理继承过程中构造函数的处理构造函数的构造函数的处理理顺序:序:C#在内部按照下列在内部按照下列顺序序处理构造函数:理构造函数:(1)先父母、后自己:被
13、)先父母、后自己:被继承的父承的父类先构造先构造,继承于父承于父类的的子子类后构造后构造(2)静)静态优先:先:静静态构造函数构造函数,静静态参数都是参数都是优先于非静先于非静态构造函数构造函数,非静非静态参数构造参数构造;【例例5-5】继承机制中构造函数的用法。承机制中构造函数的用法。17175.2 5.2 版本控制版本控制版本控制版本控制(Versioning)主要是主要是为了解决了解决组件的版本不兼容的件的版本不兼容的问题。版本控制版本控制是一个是一个过程,它以兼容的方式程,它以兼容的方式对组件件进行不断的改行不断的改进。版本兼容的方式有:版本兼容的方式有:源代源代码级兼容:依兼容:依赖
14、于旧版本的代于旧版本的代码在重新在重新编译之后能之后能够与新版本兼容。与新版本兼容。二二进制兼容:依制兼容:依赖于旧版本的于旧版本的应用程序无需重新用程序无需重新编译就能就能与新版本兼容。与新版本兼容。在解决版本在解决版本问题时,c#要求开要求开发人人员清楚地表达他清楚地表达他们的意的意图。C#语言被言被设计为不同不同库中的基中的基类和派生和派生类之之间的版本控制可以的版本控制可以衍生,并保持向后兼容。衍生,并保持向后兼容。方法:方法:用用C#编写方法写方法时,如果在,如果在扩充充类中重写基中重写基类的方法,需的方法,需要用要用override声明;要声明;要隐藏基藏基类的方法,需要用的方法,
15、需要用new声明。声明。调用非虚用非虚拟方法方法时不会受到版本的影响不会受到版本的影响调用虚用虚拟方法的方法的实现部分可能会因部分可能会因扩充充类的重写而影响的重写而影响执行行结果。果。在在 C#中,基中,基类和派生和派生类都可以自由演都可以自由演变,并能,并能够维持二持二进制兼容性制兼容性 18185.2 5.2 版本控制版本控制【例例5-6】使用使用virtual、new与与override进行版本控制。行版本控制。19195.3 5.3 接口接口 接口好比一种模版,接口好比一种模版,这种模版定种模版定义了了对象必象必须实现的方法的方法,其目的就是,其目的就是让这些方法可以作些方法可以作为
16、接口接口实例被引用。例被引用。接口中可以定接口中可以定义一个和多个方法、属性、索引指示器和事一个和多个方法、属性、索引指示器和事件。件。接口的主要特点是只有声明部分,没有接口的主要特点是只有声明部分,没有实现部分。部分。接接口是函数成口是函数成员声明的集合声明的集合。接口成接口成员的的实现是通是通过类或或结构构完成的。完成的。如果如果类或或结构从构从一个接口派生,一个接口派生,则这个个类或或结构构负责实现该接口中所声明接口中所声明的所有成的所有成员。一个接口可以从多个接口一个接口可以从多个接口继承,而一个承,而一个类或或结构可以构可以实现多个接口。多个接口。由于由于C#语言不支持多言不支持多继
17、承,因此,如果某个承,因此,如果某个类需要需要继承多承多个个类的行的行为时,只能使用多个接口加以,只能使用多个接口加以说明。明。20205.3 5.3 接口接口 1.接口的声明接口的声明使用使用interface关关键字声明一个接口。常用的字声明一个接口。常用的语法是:法是:访问修修饰符符interface接口名称接口名称/接口体(接口体(方法、属性、索引指示器和事件方法、属性、索引指示器和事件)一一般情况下,以大写的般情况下,以大写的“I”开开头指定接口名,表明指定接口名,表明这是一个接是一个接口口。访问修修饰符符:new、public、protected、internal、private。
18、声明接口声明接口时,需注意以下内容:,需注意以下内容:C#中的接口是独立于中的接口是独立于类来定来定义的的。接接口成口成员只能是方法、属性、索引指示器和事件,不能是常量、域、操只能是方法、属性、索引指示器和事件,不能是常量、域、操作符、构造函数或析构函数,不能包含任何静作符、构造函数或析构函数,不能包含任何静态成成员。接口成接口成员声明不能包含任何修声明不能包含任何修饰符,接口成符,接口成员默默认访问方式是方式是public。类可以可以继承一个基承一个基类,接口根本不能,接口根本不能继承承类。21215.3 5.3 接口接口2.接口的接口的继承承接口允接口允许多多继承,一个派生接口可以没有基接
19、口,也可以有多个基接口。承,一个派生接口可以没有基接口,也可以有多个基接口。继承方法:承方法:在在接口声明的冒号后列出被接口声明的冒号后列出被继承的接口名字,多个接口名之承的接口名字,多个接口名之间用分号分割。例子如下:用分号分割。例子如下:usingSystem;interfaceIControlvoidPaint();interfaceITextBox:IControl/继承了接口承了接口Icontrol的方法的方法Paint()voidSetText(stringtext);interfaceIListBox:IControl/继承了接口承了接口Icontrol的方法的方法Paint()
20、voidSetItems(stringitems);interfaceIComboBox:ITextBox,IListBox/可以声明新方法可以声明新方法【例例5-7】接口的声明与接口的声明与实现。22225.3 5.3 接口接口3.接口接口实现在在类中中实现接口的接口的函数成函数成员。用。用类来来实现接口接口时,接口,接口的名称必的名称必须包含在包含在类声明中的基声明中的基类列表中。列表中。如果如果类实现了某个接口,了某个接口,类也也隐式地式地继承了承了该接口的所接口的所有基接口,不管有基接口,不管这些基接口有没有在些基接口有没有在类声明的基声明的基类表中表中列出。列出。因此,如果因此,如果
21、类从一个接口派生,从一个接口派生,则这个个类负责实现该接接口及口及该接口的所有基接口中所声明的所有成接口的所有基接口中所声明的所有成员。实现接口接口的方法:的方法:1、显式式实现接口成接口成员2、继承接口承接口实现2323显式式实现接口成接口成员原因原因:定定义在不同接口中的成在不同接口中的成员可能同名,可能同名,为了避免多了避免多义性性,C#引入引入显式式实现接口成接口成员方法。方法。好好处:显式接口式接口实现允允许程序程序员实现具有相同成具有相同成员名称的两名称的两个接口,并个接口,并为每个接口成每个接口成员各提供一个各提供一个实现。using System;interface IClon
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- C#程序设计及应用教程WHUT课件第5章 面向对象的高级编程 C# 程序设计 应用 教程 WHUT 课件 面向 对象 高级 编程
限制150内