C__Ch4-面向对象高级内容

上传人:xinsh****encai 文档编号:243641598 上传时间:2024-09-27 格式:PPT 页数:45 大小:856.50KB
返回 下载 相关 举报
C__Ch4-面向对象高级内容_第1页
第1页 / 共45页
C__Ch4-面向对象高级内容_第2页
第2页 / 共45页
C__Ch4-面向对象高级内容_第3页
第3页 / 共45页
亲,该文档总共45页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述
Click to edit Title Slide,Click to edit Master text styles,Second level,Third level,Fourth level,Fifth level,*,电子科大成都学院精品课程Visual C# .Net程序设计,*,Visual C# .Net,程序设计,电子科大成都学院计算机系,课件制作:罗福强,E-Mail,:,LFQ501SOHU.COm,2024/9/27,1,电子科大成都学院精品课程Visual C# .Net程序设计,第四章 面向对象的高级程序设计,4.1,类的继承性与多态性,4.2,抽象类与接口,4.3,分部类与命名空间,4.4,委托,2024/9/27,2,电子科大成都学院精品课程Visual C# .Net程序设计,4.1,类的继承性与多态性,一、,类的继承性,二、,类的多态性,返回,2024/9/27,3,电子科大成都学院精品课程Visual C# .Net程序设计,一、,类的继承性,类的继承性最主要的优点就是能提高代码的可重用性,1,派生类的声明,2,派生类的构造函数,3,密封类,2024/9/27,4,电子科大成都学院精品课程Visual C# .Net程序设计,1,派生类的声明,(1),派生类的特点,可以拥有自己的成员,可以隐式地从基类继承所有成员,包括方法、字段、属性和事件,但私有成员、构造函数和析构函数等除外。,只能从一个类中继承,(2),一般形式,2024/9/27,5,电子科大成都学院精品课程Visual C# .Net程序设计,派生类的示例,2024/9/27,6,电子科大成都学院精品课程Visual C# .Net程序设计,2,派生类的构造函数,在,C#,中,派生类不能继承其基类的构造函数,但通过使用,base,关键字,派生类构造函数就可以调用基类的构造函数。,当创建派生类对象时,系统首先执行基类构造函数,然后执行派生类的构造函数。,实例,4-1,演示,(,源代码见教材,),2024/9/27,7,电子科大成都学院精品课程Visual C# .Net程序设计,3,密封类,使用密封类可以阻止一个类的代码被其他类继承,使用密封类的好处:,可以提高应用程序的可靠性和性能。,软件企业通过使用密封类还可以把自己的知识产权保护起来,避免他人共享代码。,在,C#,中,添加关键字,sealed,可以声明密封类。,2024/9/27,8,电子科大成都学院精品课程Visual C# .Net程序设计,二、,类的多态性,为了使用派生类能更改基类的数据和行为,,C#,提供了两种选择:,1,使用,new,关键字重新定义类的成员,2.,用,virtual,和,override,关键字定义类成员,2024/9/27,9,电子科大成都学院精品课程Visual C# .Net程序设计,1,使用,new,关键字重新定义类的成员,使用,new,关键字来定义与基类中同名的成员,即可替换基类的成员。,如果基类定义了一个方法、字段或属性,则,new,关键字用于在派生类中创建该方法、字段或属性的新定义。,new,关键字放置在要替换的类成员的返回类型之前。,例如,设基类,Person,拥有,Answer,方法,则派生类,Student,重新定义,Answer,的格式如下:,public new string Answer(),/,代码行,注,完整代码请参见教材,2024/9/27,10,电子科大成都学院精品课程Visual C# .Net程序设计,2.,用,virtual,和,override,关键字定义类成员,“使用,new,声明类的成员”的缺陷是仍然可以通过强制类型转换来继续访问基类的成员。,为了使派生类的实例完全替换来自基类的成员,在,C#,中,首先在基类中用,virtual,关键字标识虚拟成员,然后在派生类中用,override,关键将基类的虚拟成员覆盖掉。,例如,基类,Person,及其派生类,Student,的,Answer,方法书写格式如下:,注,完整代码请参见教材,2024/9/27,11,电子科大成都学院精品课程Visual C# .Net程序设计,特别注意,使用,virtual,和,override,时要注意以下几点:,(,1,)字段不能是虚拟的,只有方法、属性、事件和索引器才可以是虚拟的;,(,2,)使用,virtual,修饰符后,不允许再使用,static,、,abstract,或,override,修饰符;,(,3,)派生类对象即使被强制转换为基类对象,所引用的仍然是派生类的成员;,(,4,)派生类可以通过密封来停止虚拟继承,此时派生类的成员使用,sealed override,声明。,实例,4-2,演示(源代码见教材),返回,2024/9/27,12,电子科大成都学院精品课程Visual C# .Net程序设计,4.2,抽象类与接口,一、,抽象类,二、,接口,三、,抽象类与接口的比较,返回,2024/9/27,13,电子科大成都学院精品课程Visual C# .Net程序设计,一、,抽象类,1.,抽象类的声明,2.,抽象属性,3.,抽象方法,2024/9/27,14,电子科大成都学院精品课程Visual C# .Net程序设计,1.,抽象类的声明,在,C#,中,抽象类使用关键字,abstract,声明,.,一般形式如下:,public abstract class,抽象类名,/,类的成员,抽象类的特点:,抽象类是用来作为基类的,不能直接实例化,而且只能使用,abstract,关键字来标识。抽象类的用途是提供多个派生类可共享的基类的公共定义。,抽象类可以包含抽象的成员,如抽象属性和抽象方法,也可以包含非抽象的成员,甚至还可以包含虚方法。,2024/9/27,15,电子科大成都学院精品课程Visual C# .Net程序设计,2.,抽象属性,抽象属性的特点,抽象属性声明不提供属性访问器的实现,它只声明该类支持的属性,而将访问器的实现留给派生类。,抽象属性同样可以是只读的、只写的或可读写的属性。,当派生类从抽象类中继承一个抽象属性时,派生类必须重载该抽象属性。,抽象属性使用,abstract,关键字来标识,实例,4-3,演示(源代码参写教材),2024/9/27,16,电子科大成都学院精品课程Visual C# .Net程序设计,3.,抽象方法,抽象方法的特点:,抽象方法声明不提供方法的实现,它必须是一个空方法,而将方法实现留给派生类。,当派生类从抽象类中继承一个抽象方法时,派生类必须重载该抽象方法。,由于抽象方法没有实现,因此,抽象方法不包含常规的方法体,以分号结尾。,抽象方法使用,abstract,关键字来标识,格式如下:,访问修饰符, abstract,返回值类型 方法名(,参数列表,),;,其中,访问修饰符不能是,private,,参数列表可省略。,注意,抽象成员必须在抽象类中声明,但抽象类不要求必须包含抽象成员。,2024/9/27,17,电子科大成都学院精品课程Visual C# .Net程序设计,抽象方法示例,(完整代码请参见教材,public abstract class Person /,这是一个抽象类,/,声明抽象方法成员,注意抽象方法无方法体,public abstract string Answer();,public class Student : Person,/,重载基类的抽象方法,public override string Answer(),/,代码行,2024/9/27,18,电子科大成都学院精品课程Visual C# .Net程序设计,二、接口,1.,接口的声明,2.,接口的实现,3.,继承多个接口,2024/9/27,19,电子科大成都学院精品课程Visual C# .Net程序设计,1.,接口的声明,说明:,默认访问修饰符为,public,,还可以是,protected,、,internal,和,private,;,为了区别类,接口名的命名时建议使用大写字母,I,打头;,基接口列表可省略,表示接口也具有继承性,从多个基口继承,基接口名之间用逗号分隔。,接口成员可以是属性、方法、索引器和事件,不能包含字段、构造函数等。,所有接口成员隐式地具有了,public,访问修饰符,因此,接口成员不能添加任何访问修饰符。,2024/9/27,20,电子科大成都学院精品课程Visual C# .Net程序设计,2.,接口的实现,接口主要用来定义一个规则,让企业内部或行业内部的软件开发人员按标准去实现应用程序的功能。,因此,必须要有类或结构来继承所定义的接口并实现它,否则定义接口就毫无意义。,相关示例请参见教材,2024/9/27,21,电子科大成都学院精品课程Visual C# .Net程序设计,3.,继承多个接口,一个接口可以同时继承多个基接口的定义,一个类或结构也可以同时继承多个接口的定义。,当类继承的多个接口中存在同名的成员时,在实现时为了区分是从哪个接口继承来的,,C#,建议使用显示实现接口的方法,即使用接口名称和一个句点命名该类成员。,显示实现的成员不能带任何访问修饰符,也不能通过类的实现来引用或调用,必须通过所属的接口来引用或调用。,实例,4-4,演示(源代码参写教材),2024/9/27,22,电子科大成都学院精品课程Visual C# .Net程序设计,三、,抽象类与接口的比较,抽象类是一种不能实例化的类,抽象类可以包含抽象成员,也可以包含非抽象成员,即抽象类可以是完全实现的,也可以是部分实现的,或者完全不实现的。抽象类可以用来封装所有派生类的通用功能。,与抽象类不同的是,接口顶多像一个完全没有实现的只包含抽象成员的抽象类,因此无法使用接口来封装所有派生类的通用功能,接口更多地用来制定程序设计开发规范,接口的代码实现由开发者完成。,C#,规定一个类只能从一个基类派生,但允许从多个接口派生。,抽象类为管理组件版本提供了一个简单易行的方法。通过更新基类,所有派生类都将自动进行相应改动。而接口在创建后就不能再更改,如果需要修改接口,必须创建新的接口。,返回,2024/9/27,23,电子科大成都学院精品课程Visual C# .Net程序设计,4.3,分部类与命名空间,一、,分部类的定义,二、,使用命名空间,返回,2024/9/27,24,电子科大成都学院精品课程Visual C# .Net程序设计,一、,分部类的定义,C# 2.0,允许将类、结构或接口的定义拆分到两个或多个源文件中,让每个源文件只包含类型定义的一部分,编译时编译器自动把所有部分组合起来进行编译。,使用分部类的好处,一个类的源代码可以分布于多个独立文件中,在处理大型项目时,过去很多只能由一个人进行的编程任务,现在可以由多个人同时进行,这样将大大加快了程序设计的工作进度。,Visual Studio 2005,利分部类自动生成最基本的源代码,程序员只需编写项目的业务处理逻辑代码,编译时,Visual Studio 2005,会自动把编写的代码与自动生成的代码进行合并编译。,若要拆分类定义,可使用,partial,关键字修饰符。,2024/9/27,25,电子科大成都学院精品课程Visual C# .Net程序设计,分部类示例,2024/9/27,26,电子科大成都学院精品课程Visual C# .Net程序设计,注意事项,处理分部类的定义时需遵循以下几个规则:,(,1,)同一类型的各个部分的所有分部类的定义都必须使用,partial,进行修饰。,(,2,),partial,修饰符只能出现在紧靠关键字,class,、,struct,或,interface,前面的位置。,(,3,)分部类的各部分或者各个源文件都可以独立引用类库,且坚持“谁使用谁负责添加引用”的原则。,(,4,)分部类的定义中允许使用嵌套的分部类。,(,5,)同一类型的各个部分的所有分部类的定义都必须在同一程序集或同一模块(,.exe,或,.,dll,文件)中进行定义,分部定义不能跨越多个模块,2024/9/27,27,电子科大成都学院精品课程Visual C# .Net程序设计,二、,使用命名空间,1.,.NET Framework,的常用命名空间,2.,自定义命名空间,3.,引用命名空间中的类,2024/9/27,28,电子科大成都学院精品课程Visual C# .Net程序设计,1.,.NET Framework,的常用命名空间,2024/9/27,29,电子科大成都学院精品课程Visual C# .Net程序设计,2.,自定义命名空间,一般形式(如下图),说明,命名空间名必须遵守,C#,的命名规范,命名空间内一般由若干个类型组成,例如声明枚举型、结构型、接口和类等。,命名空间至少具有两层,即至少包含两个分类级别,两层之间使用句点(,.,)分隔。典型的命名空间是以公司名称打头,后跟部门名称或技术名称。,2024/9/27,30,电子科大成都学院精品课程Visual C# .Net程序设计,3.,引用命名空间中的类,引用命名空间中的类有两种方法:,一是采用完全限定名来引用,例如:,new,CompanyName.Sales.Customer,();,二是首先通过,using,关键字导入命名空间,再直接引用,例如:,using,CompanyName.Sales,;,new Customer();,注意,由于命名空间允许嵌套,所包含层次的数量没有限制,如果采用完全限定名来引用命名空间中的类,则程序的可读性将大大下降。在实际编程中,建议采用第二种方法来引用命名空间,相应的,using,语句一般放在,.,cs,源文件的顶部。,实例,4-5,演示(源代码参见教材),返回,2024/9/27,31,电子科大成都学院精品课程Visual C# .Net程序设计,4.4,委托,一、,委托的概述,二、,委托的声明、实例化与使用,三、,委托中的协变与逆变,四、,多路广播与委托的组合,返回,2024/9/27,32,电子科大成都学院精品课程Visual C# .Net程序设计,一、,委托的概述,委托(,delegate,)是一种引用方法的类型,它与类、接口和数组相同,属于引用型。,委托的实质是代表方法的引用(即内存地址),是定义回调方法的理想选择。,委托具有以下特点:,(,1,)委托类似于,C+,函数指针,是完全面向对象的,是安全的数据类型。,(,2,)委托允许将方法作为参数进行传递。,(,3,)委托可用于定义回调方法。,(,4,)委托可以链接在一起。例如,可以对一个事件调用多个方法。,(,5,)委托签名不需要与方法精确匹配。,2024/9/27,33,电子科大成都学院精品课程Visual C# .Net程序设计,二、,委托的声明、实例化与使用,1.,委托的声明,2.,委托的实例化,3.,调用委托,4.,使用匿名方法,2024/9/27,34,电子科大成都学院精品课程Visual C# .Net程序设计,1.,委托的声明,(1),在,C#,中使用关键字,delegate,声明委托。,(2),声明委托的一般形式如下:,访问修饰符, delegate,返回值类型 委托名,(,参数列表,);,其中,访问修饰符与声明类、接口和结构的访问修饰符相同,返回值类型是委托所要引用的方法的返回值类型,参数列表是委托所要引用的方法的形式参数列表,当所要引用的方法无参数时,省略参数列表。,例如:,public delegate,int,Calculate(int,x,int,y);,(3),注意,在,.NET Framework,中,自定义的委托自动从,Delegate,类派生,因此不能再从,Delegate,中派生委托。由于委托是密封的,因此也不能从自定义的委托派生。委托类型一般使用默认的构造函数。,2024/9/27,35,电子科大成都学院精品课程Visual C# .Net程序设计,2.,委托的实例化,因为委托是一种特殊的数据类型,因此必须实例化之后才能用来引用方法。,实例化委托的一般形式如下:,委托类型 委托变量名,= new,委托型构造函数,(,委托要引用的方法名,),说明,委托类型就是前面使用,delegate,声明的委托名。,2024/9/27,36,电子科大成都学院精品课程Visual C# .Net程序设计,3.,调用委托,在实例化委托之后,就可以通过委托对象调用它所引用的方法。在使用委托对象调用所引用的方法时,必须保证参数的类型、个数、顺序和方法声明匹配。,例如:,Calculate cal = new,Calculate(Product,);,int,result = cal(3,6);,就表示通过,Calculate,型的委托对象,cal,来调用方法,Product,,其实参为,3,和,6,,因此最终返回并赋给变量,result,的值为,18,。,2024/9/27,37,电子科大成都学院精品课程Visual C# .Net程序设计,4.,使用匿名方法,C# 2.0,引入了匿名方法的概念,它允许将代码块作为参数传递,以代替单独定义的方法。使用匿名方法创建委托对象的一般形式如下:,委托类型 委托变量名,= delegate(,参数列表,),代码块,;,例如:,Calculate cal =,delegate(int,x,int,y), return (,int)Math.Pow(x, y); ;,就表示用匿名的方法定义了一个,Calculate,型的委托对象,cal,,用来计算,x,的,y,次方值。,实例,4-6,演示(源代码参见教材),2024/9/27,38,电子科大成都学院精品课程Visual C# .Net程序设计,三、,委托中的协变与逆变,1.,协变,2.,逆变,2024/9/27,39,电子科大成都学院精品课程Visual C# .Net程序设计,1.,协变,协变允许所调用方法的返回类型可以是委托的返回类型的派生类型,当委托方法的返回类型具有的派生程度比委托签名更大时,就称为协变委托方法。因为方法的返回类型比委托签名的返回类型更具体,所以可对其进行隐式转换。,例如,已知,Students,类为,Persons,类的派生类,,Persons,类和,Students,类都是集合类,它们都有一个用来返回第,i,个元素的方法,声明格式分别如下:,public Person,getPerson(int,i),public Student,getStudent(int,i) ,现存在一个委托,PointPerson,,声明格式如下:,public delegate Person,PointPerson(int,i);,显然委托,PointPerson,的签名与方法,getPerson,的签名匹配,可以直接通过该委托对象来调用方法,getPerson,,而方法,getStudent,的返回值类型是委托,PointPerson,返回值类型的派生类,因此方法,getStudent,是协变委托方法。如果通过委托对象来调用方法,getStudent,,则系统将进行隐式转换,把,getStudent,的返回值类型,Student,转换为,Person,。,2024/9/27,40,电子科大成都学院精品课程Visual C# .Net程序设计,2.,逆变,逆变允许将带有派生参数的方法用作委托,当委托方法签名具有一个或多个参数,并且这些参数的类型派生自方法参数的类型时,就称为逆变委托方法。因为委托方法签名参数比方法参数更具体,所以可以在传递给处理程序方法时对它们进行隐式转换。,例如,在协变例子中的集合类都还具有一个返回某个元素位置的方法,声明格式分别如下:,public,int,getPos(Person,p),public,int,getPos(Student,s),现存在一个委托,Position,,声明格式如下:,public delegate,int,Position(Student,s),实例,4-7,演示(源代码参见教材),2024/9/27,41,电子科大成都学院精品课程Visual C# .Net程序设计,四、,多路广播与委托的组合,C#,允许使用一个委托对象来同时调用多个方法,此时这种委托就是多路广播委托,这些方法的引用构成了委托的调用列表。,C#,所有委托都是隐式的多路广播委托。向一个委托的调用列表添加多个方法引用,可通过调用该委托一次性调用所有的方法,这一过程称为多路广播。,实现多路广播的方法有两种:,1.,通过“,+”,运算符直接把同类型的委托对象组合起来;,2.,通过“,+=”,运算符将新创建的委托对象添加到调用列表。,当然使用“,=”,运算符来移除调用列表中的委托对象。,实例,4-8,演示(源代码参见教材),返回,2024/9/27,42,电子科大成都学院精品课程Visual C# .Net程序设计,本章要点,本章分,4,个专题详细介绍了,C#,在面向对象程序设计方面的高级应用。首先介绍了类的继承性和多态性,然后介绍了抽象类与接口应用,接着介绍了分部类与命名空间的作用,最后介绍了委托的相关概念以及委托的声明、实例化与使用方法。本章的内容都比较抽象,不容易理解,为此,本章为每一个专题提供了完整的典型案例,以演示相关技术的应用。,2024/9/27,43,电子科大成都学院精品课程Visual C# .Net程序设计,作业,1.,书面作业(见本章教材),2.,上机实验(见本章教材),2024/9/27,44,电子科大成都学院精品课程Visual C# .Net程序设计,Class Over,Thank you!,2024/9/27,45,电子科大成都学院精品课程Visual C# .Net程序设计,
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 图纸专区 > 大学资料


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!