说明分析课件罗c ch《VisualC#._第1页
说明分析课件罗c ch《VisualC#._第2页
说明分析课件罗c ch《VisualC#._第3页
说明分析课件罗c ch《VisualC#._第4页
说明分析课件罗c ch《VisualC#._第5页
已阅读5页,还剩40页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、2022-3-10Visual C# .Net程序设计1Visual C# .Net程序设计Visual C# .Net程序设计22022-3-10第四章 面向对象的高级程序设计 n4.1 类的继承性与多态性 n4.2 抽象类与接口 n4.3 分部类与命名空间 n4.4 委托 Visual C# .Net程序设计32022-3-104.1 类的继承性与多态性 n一、类的继承性 n二、类的多态性 Visual C# .Net程序设计42022-3-10一、类的继承性类的继承性最主要的优点就是能提高代码的可重用性 n1派生类的声明n2派生类的构造函数n3密封类Visual C# .Net程序设计5

2、2022-3-101派生类的声明派生类的声明n(1) 派生类的特点可以拥有自己的成员可以隐式地从基类继承所有成员,包括方法、字段、属性和事件,但私有成员、构造函数和析构函数等除外。只能从一个类中继承 n(2) 一般形式Visual C# .Net程序设计62022-3-10派生类的示例Visual C# .Net程序设计72022-3-102派生类的构造函数n在C#中,派生类不能继承其基类的构造函数,但通过使用base关键字,派生类构造函数就可以调用基类的构造函数。n当创建派生类对象时,系统首先执行基类构造函数,然后执行派生类的构造函数。 n实例4-1演示(源代码见教材)Visual C# .

3、Net程序设计82022-3-103密封类n使用密封类可以阻止一个类的代码被其他类继承n使用密封类的好处:可以提高应用程序的可靠性和性能。软件企业通过使用密封类还可以把自己的知识产权保护起来,避免他人共享代码。n在C#中,添加关键字sealed可以声明密封类。 Visual C# .Net程序设计92022-3-10二、类的多态性n为了使用派生类能更改基类的数据和行为,C#提供了两种选择:n1使用new关键字重新定义类的成员n2. 用virtual和override关键字定义类成员 Visual C# .Net程序设计102022-3-101使用new关键字重新定义类的成员n使用new关键字来

4、定义与基类中同名的成员,即可替换基类的成员。n如果基类定义了一个方法、字段或属性,则 new 关键字用于在派生类中创建该方法、字段或属性的新定义。nnew 关键字放置在要替换的类成员的返回类型之前。 n例如,设基类Person拥有Answer方法,则派生类Student重新定义Answer的格式如下:public new string Answer() /代码行注,完整代码请参见教材Visual C# .Net程序设计112022-3-102. 用virtual和override关键字定义类成员n“使用new声明类的成员”的缺陷是仍然可以通过强制类型转换来继续访问基类的成员。n为了使派生类的实

5、例完全替换来自基类的成员,在C#中,首先在基类中用virtual 关键字标识虚拟成员,然后在派生类中用 override 关键将基类的虚拟成员覆盖掉。n例如,基类Person及其派生类Student的Answer方法书写格式如下:Visual C# .Net程序设计122022-3-10特别注意n使用virtual和override时要注意以下几点:(1)字段不能是虚拟的,只有方法、属性、事件和索引器才可以是虚拟的;(2)使用virtual修饰符后,不允许再使用static、abstract或override修饰符;(3)派生类对象即使被强制转换为基类对象,所引用的仍然是派生类的成员;(4)派

6、生类可以通过密封来停止虚拟继承,此时派生类的成员使用sealed override声明。n实例4-2演示(源代码见教材) Visual C# .Net程序设计132022-3-104.2 抽象类与接口n一、抽象类 n二、接口 n三、抽象类与接口的比较 Visual C# .Net程序设计142022-3-10一、抽象类n1. 抽象类的声明 n2. 抽象属性n3. 抽象方法 Visual C# .Net程序设计152022-3-101. 抽象类的声明n在C#中,抽象类使用关键字abstract声明.n一般形式如下:public abstract class 抽象类名 / 类的成员n抽象类的特点:

7、抽象类是用来作为基类的,不能直接实例化,而且只能使用abstract关键字来标识。抽象类的用途是提供多个派生类可共享的基类的公共定义。抽象类可以包含抽象的成员,如抽象属性和抽象方法,也可以包含非抽象的成员,甚至还可以包含虚方法。Visual C# .Net程序设计162022-3-102. 抽象属性n抽象属性的特点抽象属性声明不提供属性访问器的实现,它只声明该类支持的属性,而将访问器的实现留给派生类。抽象属性同样可以是只读的、只写的或可读写的属性。当派生类从抽象类中继承一个抽象属性时,派生类必须重载该抽象属性。n抽象属性使用abstract关键字来标识 n实例4-3演示(源代码参写教材)Vis

8、ual C# .Net程序设计172022-3-103. 抽象方法n抽象方法的特点:抽象方法声明不提供方法的实现,它必须是一个空方法,而将方法实现留给派生类。当派生类从抽象类中继承一个抽象方法时,派生类必须重载该抽象方法。由于抽象方法没有实现,因此,抽象方法不包含常规的方法体,以分号结尾。n抽象方法使用abstract关键字来标识,格式如下:访问修饰符 abstract 返回值类型 方法名(参数列表);其中,访问修饰符不能是private,参数列表可省略。n注意,抽象成员必须在抽象类中声明,但抽象类不要求必须包含抽象成员。 Visual C# .Net程序设计182022-3-10抽象方法示例

9、(完整代码请参见教材npublic abstract class Person /这是一个抽象类nn n /声明抽象方法成员,注意抽象方法无方法体n public abstract string Answer();nnpublic class Student : Person nn /重载基类的抽象方法n public override string Answer()n n /代码行n nVisual C# .Net程序设计192022-3-10二、接口 n1. 接口的声明 n2. 接口的实现 n3. 继承多个接口 Visual C# .Net程序设计202022-3-101. 接口的声明n说

10、明:默认访问修饰符为public,还可以是protected、internal和private;为了区别类,接口名的命名时建议使用大写字母I打头;基接口列表可省略,表示接口也具有继承性,从多个基口继承,基接口名之间用逗号分隔。接口成员可以是属性、方法、索引器和事件,不能包含字段、构造函数等。所有接口成员隐式地具有了public访问修饰符,因此,接口成员不能添加任何访问修饰符。Visual C# .Net程序设计212022-3-102. 接口的实现n接口主要用来定义一个规则,让企业内部或行业内部的软件开发人员按标准去实现应用程序的功能。n因此,必须要有类或结构来继承所定义的接口并实现它,否则定

11、义接口就毫无意义。n相关示例请参见教材Visual C# .Net程序设计222022-3-103. 继承多个接口n一个接口可以同时继承多个基接口的定义,一个类或结构也可以同时继承多个接口的定义。n当类继承的多个接口中存在同名的成员时,在实现时为了区分是从哪个接口继承来的,C#建议使用显示实现接口的方法,即使用接口名称和一个句点命名该类成员。n显示实现的成员不能带任何访问修饰符,也不能通过类的实现来引用或调用,必须通过所属的接口来引用或调用。n实例4-4演示(源代码参写教材)Visual C# .Net程序设计232022-3-10三、抽象类与接口的比较n抽象类是一种不能实例化的类,抽象类可以

12、包含抽象成员,也可以包含非抽象成员,即抽象类可以是完全实现的,也可以是部分实现的,或者完全不实现的。抽象类可以用来封装所有派生类的通用功能。n与抽象类不同的是,接口顶多像一个完全没有实现的只包含抽象成员的抽象类,因此无法使用接口来封装所有派生类的通用功能,接口更多地用来制定程序设计开发规范,接口的代码实现由开发者完成。nC#规定一个类只能从一个基类派生,但允许从多个接口派生。n抽象类为管理组件版本提供了一个简单易行的方法。通过更新基类,所有派生类都将自动进行相应改动。而接口在创建后就不能再更改,如果需要修改接口,必须创建新的接口。Visual C# .Net程序设计242022-3-104.3

13、 分部类与命名空间 n一、分部类的定义n二、使用命名空间 Visual C# .Net程序设计252022-3-10一、分部类的定义nC# 2.0允许将类、结构或接口的定义拆分到两个或多个源文件中,让每个源文件只包含类型定义的一部分,编译时编译器自动把所有部分组合起来进行编译。n使用分部类的好处一个类的源代码可以分布于多个独立文件中,在处理大型项目时,过去很多只能由一个人进行的编程任务,现在可以由多个人同时进行,这样将大大加快了程序设计的工作进度。Visual Studio 2005利分部类自动生成最基本的源代码,程序员只需编写项目的业务处理逻辑代码,编译时Visual Studio 2005

14、会自动把编写的代码与自动生成的代码进行合并编译。n若要拆分类定义,可使用 partial 关键字修饰符。Visual C# .Net程序设计262022-3-10分部类示例 Visual C# .Net程序设计272022-3-10注意事项处理分部类的定义时需遵循以下几个规则:(1)同一类型的各个部分的所有分部类的定义都必须使用partial进行修饰。(2)partial修饰符只能出现在紧靠关键字 class、struct或interface前面的位置。(3)分部类的各部分或者各个源文件都可以独立引用类库,且坚持“谁使用谁负责添加引用”的原则。(4)分部类的定义中允许使用嵌套的分部类。(5)同

15、一类型的各个部分的所有分部类的定义都必须在同一程序集或同一模块(.exe 或 .dll 文件)中进行定义,分部定义不能跨越多个模块 Visual C# .Net程序设计282022-3-10二、使用命名空间n1. .NET Framework的常用命名空间 n2. 自定义命名空间 n3. 引用命名空间中的类 Visual C# .Net程序设计292022-3-101. .NET Framework的常用命名空间 Visual C# .Net程序设计302022-3-102. 自定义命名空间n一般形式(如下图)n说明命名空间名必须遵守C#的命名规范,命名空间内一般由若干个类型组成,例如声明枚举

16、型、结构型、接口和类等。命名空间至少具有两层,即至少包含两个分类级别,两层之间使用句点(.)分隔。典型的命名空间是以公司名称打头,后跟部门名称或技术名称。Visual C# .Net程序设计312022-3-103. 引用命名空间中的类n引用命名空间中的类有两种方法:n一是采用完全限定名来引用,例如:new CompanyName.Sales.Customer();n二是首先通过using关键字导入命名空间,再直接引用,例如:using CompanyName.Sales;new Customer();n注意,由于命名空间允许嵌套,所包含层次的数量没有限制,如果采用完全限定名来引用命名空间中的

17、类,则程序的可读性将大大下降。在实际编程中,建议采用第二种方法来引用命名空间,相应的using语句一般放在.cs源文件的顶部。 n实例4-5演示(源代码参见教材)Visual C# .Net程序设计322022-3-104.4 委托 n一、委托的概述 n二、委托的声明、实例化与使用 n三、委托中的协变与逆变n四、多路广播与委托的组合 Visual C# .Net程序设计332022-3-10一、委托的概述 n委托(delegate)是一种引用方法的类型,它与类、接口和数组相同,属于引用型。n委托的实质是代表方法的引用(即内存地址),是定义回调方法的理想选择。 n委托具有以下特点:(1)委托类似

18、于 C+ 函数指针,是完全面向对象的,是安全的数据类型。(2)委托允许将方法作为参数进行传递。(3)委托可用于定义回调方法。(4)委托可以链接在一起。例如,可以对一个事件调用多个方法。(5)委托签名不需要与方法精确匹配。 Visual C# .Net程序设计342022-3-10二、委托的声明、实例化与使用 n1. 委托的声明n2. 委托的实例化 n3. 调用委托n4. 使用匿名方法 Visual C# .Net程序设计352022-3-101. 委托的声明n(1) 在C#中使用关键字delegate声明委托。n(2) 声明委托的一般形式如下:访问修饰符 delegate 返回值类型 委托名(

19、参数列表);n其中,访问修饰符与声明类、接口和结构的访问修饰符相同,返回值类型是委托所要引用的方法的返回值类型,参数列表是委托所要引用的方法的形式参数列表,当所要引用的方法无参数时,省略参数列表。n例如:public delegate int Calculate(int x, int y);n(3) 注意,在.NET Framework 中,自定义的委托自动从Delegate 类派生,因此不能再从 Delegate 中派生委托。由于委托是密封的,因此也不能从自定义的委托派生。委托类型一般使用默认的构造函数。 Visual C# .Net程序设计362022-3-102. 委托的实例化n因为委托

20、是一种特殊的数据类型,因此必须实例化之后才能用来引用方法。n实例化委托的一般形式如下:委托类型 委托变量名 = new 委托型构造函数(委托要引用的方法名)n说明,委托类型就是前面使用delegate声明的委托名。 Visual C# .Net程序设计372022-3-103. 调用委托n在实例化委托之后,就可以通过委托对象调用它所引用的方法。在使用委托对象调用所引用的方法时,必须保证参数的类型、个数、顺序和方法声明匹配。n例如:Calculate cal = new Calculate(Product);int result = cal(3,6); 就表示通过Calculate型的委托对象c

21、al来调用方法Product,其实参为3和6,因此最终返回并赋给变量result的值为18。Visual C# .Net程序设计382022-3-104. 使用匿名方法nC# 2.0引入了匿名方法的概念,它允许将代码块作为参数传递,以代替单独定义的方法。使用匿名方法创建委托对象的一般形式如下:n委托类型 委托变量名 = delegate(参数列表)代码块;n例如:Calculate cal = delegate(int x,int y) return (int)Math.Pow(x, y); ;就表示用匿名的方法定义了一个Calculate型的委托对象cal,用来计算x的y次方值。n 实例4-

22、6演示(源代码参见教材)Visual C# .Net程序设计392022-3-10三、委托中的协变与逆变n1. 协变协变n2. 逆变 Visual C# .Net程序设计402022-3-101. 协变协变n协变允许所调用方法的返回类型可以是委托的返回类型的派生类型,当委托方法的返回类型具有的派生程度比委托签名更大时,就称为协变委托方法。因为方法的返回类型比委托签名的返回类型更具体,所以可对其进行隐式转换。n例如,已知Students类为Persons类的派生类,Persons类和Students类都是集合类,它们都有一个用来返回第i个元素的方法,声明格式分别如下:public Person

23、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。Visual C# .Net程序设计412022-3-102. 逆变n逆变允许将带有派生参数的方法用作委托,当委托方法签名具有一个或多个参数,并且这些参数的类型派生自方法参数的类型时,就称为逆变委托方法。因为委托方法签名参数比方法参数更具体,所

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论