您好,欢迎来到百家汽车网。
搜索
您的当前位置:首页类的继承和多态

类的继承和多态

来源:百家汽车网
课程名称:.NET应用开发 第三章 面向对象的程序设计(OOP)

《3.2 类的继承和多态》

1. 目标概述 [2分钟] ................................................................................................... 2 2. 回顾 [5分钟] .......................................................................................................... 2 3. 课程知识点讲解 ........................................................................................................ 2

3.1. 3.2. 3.3. 3.4. 3.5.

面向对象编程概述 [10分钟] .................................................................. 2 类的定义 [45分钟] ................................................................................ 4 方法 [45分钟] ....................................................................................... 6 属性 [35分钟] ......................................................... 错误!未定义书签。 索引器 [35分钟]...................................................... 错误!未定义书签。

4. 小结 [3分钟] .......................................................................................................... 7 5. 考核点 ...................................................................................................................... 8 6. 作业答案................................................................................................................... 8 7. 扩展练习................................................................................................................... 9 8. 学生问题汇总............................................................................................................ 9 9. 教学后记................................................................................................................... 9

- - 1

课程名称:.NET应用开发 第三章 面向对象的程序设计(OOP)

本节目标

 本节中将讲述如下主要内容:

 C#中继承的基本概念

 通过虚方法来实现对象的多态性

 

抽象类和抽象方法 接口

 命名空间

 通过教学使学生掌握C#的类和接口的定义,掌握C#类的继承方法。

本节重点

 C#中继承的基本概念

 通过虚方法来实现对象的多态性  抽象类和抽象方法  接口

 命名空间

本节难点

授课课时

 4课时

教法建议

1. 目标概述 [2分钟]

本节主要讲述掌握C#的类和接口的定义,C#类的继承方法。

2. 回顾 [5分钟]

回顾上一节的相关知识。

3. 课程知识点讲解

3.1. 继承 [80分钟] 引入:

主题:

为了声明一个类是从另一个类继承的,需要使用下面的语法: Class DerivedClass:BaseClass{

- -

2

课程名称:.NET应用开发 第三章 面向对象的程序设计(OOP)

…….. }

DerivedClass(派生类)将从BaseClass(基类)继承。

一个类最多只允许从一个类中派生;不允许从两个或者更多的类中派生。 在C#中的继承符合下列规则:     

继承是可传递的。如果C从B中派生,B又从A中派生,那么C不仅继承了B中声明的成员,同样也继承了A中的成员。Object类作为所有类的基类。

派生类应当是对基类的扩展。派生类可以添加新的成员,但不能除去已经继承的成员的定义。

构造函数和析构函数不能被继承。除此以外的其它成员,不论对它们定义了怎样的访问方式,都能被继承。基类中成员的访问方式只能决定派生类能否访问它们。 派生类如果定义了与继承而来的成员同名的新成员,就可以覆盖已继承的成员。但这并不因为这派生类删除了这些成员,只是不能再访问这些成员。

类可以定义虚方法、虚属性以及虚索引指示器,它的派生类能够重载这些成员,从而实现类可以展示出多态性。 1.覆盖

在类的成员声明中,可以声明与继承而来的成员同名的成员。 2.多态(Polymorphism)

在面向对象的系统中,多态性是一个非常重要的概念,它允许客户对一个对象进行操作,由对象来完一系列的动作,具体实现哪个动作,如何实现由系统负责解释。

在C#中,多态性是指同一操作作用于不同的类的实例,不同的类将进行不同的解释,最后产生不同的执行结果。C#支持两种类型的多态性:

编译时的多态性

编译时的多态性是通过重载来实现的。对于非虚的成员来说,系统在编译时,根据传递的参数,返回的类型等信息决定实现何种操作。

运行时的多态性

运行时的多态性就是指直到系统运行时,才根据实际情况决定实现何种操作。C#中,运行时的多态性通过虚成员实现。

编译时的多态提供了运行速度快的特点,而运行时的多态性则带来了高度灵活和抽象的特点。

(1)虚方法

当类中的方法声明前加上了virtual修饰符,就称之为虚方法,反之为非虚。 (2)在派生类中对虚方法进行重载

我们知道普通的方法重载指的是:类中两个以上的方法(包括隐藏的继承而来的方法),取的名字相同,只要使用的参数类型或者参数个数不同,编译器便在何种情况下应该调用哪个方法。而对基类虚方法的重载是函数重载的另一种特殊形式。在派生类中重新定义此虚函数时,要求的是方法名称、返回值类型、参数表中的参数个数、类型、顺序都必须与基类中

- -

3

课程名称:.NET应用开发 第三章 面向对象的程序设计(OOP)

的虚函数完全一致。在派生类中声明对虚方法的重载,要求在声明中加上override关键字,而且不能有new,static或virtual修饰符。

3.抽象

有时候,基类并不与具体的事物相联系,而是只表达一种抽象的概念,用以为它的派生类提供一个公共的界面。为此,C#中引入了抽象类(abstract class)的概念。抽象类使用abstract修饰符,对抽象类的使用有以下几点规定:

抽象类只能作为其它类的基类,它不能直接被实例化,而且对抽象类不能使用new操作符。抽象类如果含有抽象的变量或值,则它们要么是null类型,要么包含了对非抽象类的实例的引用。  

抽象类允许包含抽象成员,虽然这不是必须的。 抽象类不能同时又是密封的。

如果一个非抽象类从抽象类中派生,则其必须通过重载来实现所有继承而来的抽象成员。

4.抽象方法

由于抽象类本身表达的是抽象的概念,因此类中的许多方法并不一定要有具体的实现,而只是留出一个接口来作为派生类重载的界面。

一个方法声明中如果加上abstract修饰符,我们称该方法为抽象方法(abstract method)。如果一个方法被声明也是抽象的,那么该方法默认也是一个虚方法。事实上,抽象方法是一个新的虚方法,它不提供具体的方法实现程序,而非虚派生类要求通过重载为继承的虚方法提供自己的实现,而抽象方法则不包含具体的实现内容,所以方法声明的执行体中只有一个分号“;”。只能在抽象类中声明抽象方法。对抽象方法,不能再使用static或virtual修饰符,而且方法不能有任何可执行程序,哪怕只是一对大括号中间加一个一个分号“{;}”都不允许出现,只需要给出方法的原型就可以了。

5.密封类和密封方法

密封类在声明中使用sealed修饰符,这样就可以防止该类被其它类继承。如果试图将一个密封类作为其它类的基类,C#将提示出错。密封类不能同时又是抽象类,因为抽象类总是希望被继承的。密封类中如果存在虚成员函数,该成员函数可以转化为非虚的,函数修饰符virtual不再生效。

同样在C#中还提出了密封方法(sealed method),以防止在方法所在类的派生类中对该方法的重载。如果使用sealed修饰符来定义方法,那么我们就称该方法为密封方法。注意不是类的每个成员方法都可以作为密封方法,密封方法必须是对基类的虚方法进行重载,提供具体的实现方法。所以,在方法的声明中,sealed修饰符总是和override修饰同时使用。

3.2. 接口 [45分钟] 引入:

- - 4

课程名称:.NET应用开发 第三章 面向对象的程序设计(OOP)

主题:

接口(interface)是把隐式公共方法和属性组合起来,以封装特定功能的一个集合。一旦定义了接口,就可以在类中实现它。这样,类就可以支持接口所指定的所有属性和成员。 注意,接口不能单独存在。不能象实例化一个类那样实例化接口。另外,接口不能包含实现其成员的任何程序,而只能定义成员本身。实现过程必须在实现接口的类中实现。

一个类可以支持多个接口,多个类也可以支持相同的接口。

1.定义接口

从技术层面上来说,接口是一组包含了函数型方法的数据结构。通过这组数据结构,客户代码可以调用组件对象的功能。

接口声明实际上就是一种定义新的接口的类型声明,声明的格式如下: Attributes interface-modifiers interface identifier interfacebase interface-body; 接口仅可以使用下列修饰符:     

new public protected internal private

在一个接口定义中同一修饰符不允许出现多次,new修饰符只能出现在嵌套接口中,表示覆盖了继承而来的同名成员。而public,protected和private修饰符定义了对接口的访问权限。在接口的声明体中,可以定义接口的成员。接口的成中可以是方法、属性、索引指示器和事件。

2.接口的继承

接口具有不变性,但这并不意味着接口不再发展。类似于类的继承性,接口也可以继承和发展。但是接口继承与类继承不同,首先类继承不仅是说明继承,而且也是实现继承;而接口继承只是说明继承。也说是说,派生类可以继承基类的方法实现,而派生接口只继承了父接口的成员方法说明,而没有继承父接口的实现。其次,C#中类继承只允许单继承,但是接口继承允许多继承,一个子接口可以有多个父接口。

接口可以从零或多个接口中继承。从多个接口中继承时,用“:”后跟被继承的接口名字,多个接口名之间用“,”分割。被继承的接口应该是可以访问得到的,比如从private类型或internal类型的接口中继承就是不允许的。接口不允许直接或间接地从自身继承。

3.接口的成员

接口可以包含一个和多个成员,这些成员可以是方法、属性、索引指示器和事件,但不能是常量、域、操作符、构造函数或析构函数,而且不能包含任何静态成员。

接口成员默认访问方式是public。接口成员声明不能包含任何修饰符,比如成员声明前不能加abstract,public,protected,internal,private,virtual,override或static修饰符。

接口的成员之间不能相互同名。继承而来的成员不用再声明,但接口可以定义与继承而来的成员同名的成员,这称为接口成员覆盖了继承而来的成员,这不会导致错误,但编译器会给出一个警告。关闭警告提示的方法是在成员声明前加上一个new关键字。但如果没有覆盖父接口中的成员,使用new关键字会导致编译器发出警告。

4.接口的实现

- -

5

课程名称:.NET应用开发 第三章 面向对象的程序设计(OOP)

由前述可知,接口定义不包括方法的实现部分。接口可以通过类或结构来实现。用类来实现接口时,接口的名称必须包含在类声明中的基类列表中。下面的示例程序给出了由类来实现接口的例子。其中ISequence为一个队列接口,提供了向队列尾部添加对象的成员方法Add(),IRing为一循环表接口,提供了向环中插入对象的方法Insert(object obj),方法返回插入的位置。

3.3. 命名空间 [45分钟] 引入:

主题:

命名空间(namespace)又称名字空间是.NET避免类名冲突的一种方式。例如,命名空间可以避免下述情况:定义一个类来表示一个顾客,称此类为Customer,同时其他人也在做相同的事。命名空间不过是一组数据类型,但命名空间中所有数据类型的名称都会自动加上一个该名称空间的名字作为其前缀。命名空间还可以相互嵌套。例如,大多数用于一般目的的.NET基类位于名称空间System中,基类Array在这个名称空间中,所以其全名是System.Array。

命名空间的声明是关键字“namespace”后跟名字空间名和名字空间主体,然后还可以跟一个分号。语法格式如下: namespace 名称 [ [.名称2] …]{ 类型声明 } 其中,名称:命名空间的名称,用圆点“.”隔开;类型声明:包括namespace、class、interface、struct、enum、delegate等6种。

命名空间的声明要么在编译单元的第一行出现,要么作为成员出现在其它命名空间的声明之中。首次声明的命名空间是全局命名空间的成员,在别的命名空间内部声明的命名空间作为外部命名空间的成员。在这两种情况下,命名空间都不允许出现重名。

命名空间隐式地使用public修饰符,在声明时不允许使用任何访问修饰符。 1.成员与类型声明

命名空间的成员可以是一个类型(类、结构、接口、枚举或委派),也可以是另一个命名空间。一个编译单元或命名空间主体中可以包含多个成员声明,这些声明给编译单元或命名空间主体中添加了新的成员。

命名空间中的类型声明可以是类的声明、结构的声明、接口的声明、枚举声明或是委派的声明。一个类型声明可以在编译单元的第一行作为顶层声明出现,也可以出现在编译单元的内部,作为成员声明。类型声明还可以是在命名空间、类或结构的内部作为成员声明出现。

对类型声明的访问权限与类型声明所处的位置有关:  

- -

对在编译单元中一开始就声明的类型,访问权限可以是公有(public)的,也可以是内部(internal)的。默认的访问权限是内部的。

在类中声明的类型,访问权限可以是公有的,保护的,内部的或是私有的,默认的

6

课程名称:.NET应用开发 第三章 面向对象的程序设计(OOP)

访问方式是私有的。

在结构中声明的类型,访问可以是公有的,内部的或是私有的。默认的访问方式是私有的。

2.命名空间使用指示符

使用命名空间指示符为编译单元或命名空间主体导入了另一个命名空间的类型,对这些类型的使用无需全名。使用名字空间指示符的语法格式:

using namespace-name;

命名空间使用指示符还可以为命名空间建立别名,以实现简化命名空间的目的。建立别名的格式如下:

using 别名=命名空间或类名称; 3.常用命名空间 命名空间 System.Data System.IO System.Windows System.Reflection System.Threading System.Collections 说明 处理数据访问和管理;在定义ADO.NET技术中起重要作用 管理对文件和流的同步和异步访问 处理基于窗体的Windows创建 包含用于从程序集里读取元数据的类 包含用于多线程编程的类 包含不同的接口和类,这些接口和类用来定义不同的对象 4. 小结 [3分钟]

本节在介绍了面向对象编程基础知识的基础上进一步讲述了类的继承、多态和接口。具体内容如下:

1.继承

继承是面向对象系统中一个非常重要的概念。在C#语言中提供了一整套设计良好的继承机制,包括:

  

派生类对基类的继承。 方法的继承。

属性及其访问器的继承。

2.多态

在面向对象的系统中,多态性同样是一个非常重要的概念,它允许客户对一个对象进行操作,由对象来完一系列的动作,具体实现哪个动作,如何实现由系统负责解释。

在C#中,多态性是指同一操作作用于不同的类的实例,不同的类将进行不同的解释,最后产生不同的执行结果。C#支持两种类型的多态性:编译时的多态性(通过重载实现的多态)和运行时多态性(是通过虚成员来实现的多态)。

3.接口

- -

7

课程名称:.NET应用开发 第三章 面向对象的程序设计(OOP)

接口(interface)是把隐式公共方法和属性组合起来,以封装特定功能的一个集合。一旦定义了接口,就可以在类中实现它。这样,类就可以支持接口所指定的所有属性和成员。接口是不能单独存在的,不能象实例化类一样实例化接口。另外接口不能包含实现其成员的任何程序,而只能定义成员本身。实现过程必须在实现接口的类中实现。

4.命名空间

命名空间(namespace)又称名字空间是.NET避免类名冲突的一种方式。命名空间不过是一组数据类型,但命名空间中所有数据类型的名称都会自动加上一个该名称空间的名字作为其前缀。它可以相互嵌套。

命名空间中的类型声明可以是类的声明、结构的声明、接口的声明、枚举声明或是委派的声明。一个类型声明可以在编译单元的第一行作为顶层声明出现,也可以出现在编译单元的内部,作为成员声明。

使用命名空间指示符为编译单元或命名空间主体导入了另一个命名空间的类型,对这些类型的使用无需全名。使用名字空间指示符的语法格式:

using namespace-name;

5. 考核点

考核点1:继承 考核点2:多态

考核点3:接口

考核点4:命名空间

6. 作业答案

1:继承是否破坏了对象的封装性。 答:

2:举一个例子,说明派生类对基类成员方法的覆盖和重载有什么区别。 答:

3:举例说明base保留字的用法。在哪些情况下不允许使用base保留字? 答:

4:多态性的含义是什么?C#提供了哪两种多态性?说明它们之间有什么区别。 答:在面向对象的系统中,多态性同样是一个非常重要的概念,它允许客户对一个对象进行操作,由对象来完一系列的动作,具体实现哪个动作,如何实现由系统负责解释。 在C#中,多态性是指同一操作作用于不同的类的实例,不同的类将进行不同的解释,最后产生不同的执行结果。C#支持两种类型的多态性:编译时的多态性(通过重载实现的多态)和运行时多态性(是通过虚成员来实现的多态)。

5:创建一个Shape类,此类包含一个名为_color的数据成员(用于存放颜色值)和一个getColor()方法。这个类还包含一个名为getArea()的抽象方法。用这个类创建名为Circle和Square的两个子类,这两个类都包含两个数据成员,即_radius和_sideLine。这些派生类应提供getArea()方法的实现,以计算相应形状的面积。

- -

8

课程名称:.NET应用开发 第三章 面向对象的程序设计(OOP)

答:具体见solution-code/T3_2_5.cs 6:试论述接口映射的过程。 答:

7:假设一个类中采用了显式接口成员执行体实现了某个接口成员,可否在它的派生类中重载这个成员? 答:

7. 扩展练习

8. 学生问题汇总

(注:汇总学生在学习过程中容易出现的问题)

9. 教学后记

(注:在此写上个人在授课过程中所遇到的教案中所没有涉及到的特殊问题及其解决方法或解决方案,也可以总结自己的授课体会,课程体系、教材的不足等。)

授课教师(签名): 授课时间: 授课班级:

- - 9

因篇幅问题不能全部显示,请点此查看更多更全内容

Copyright © 2019- baijiahaobaidu.com 版权所有 湘ICP备2023023988号-9

违法及侵权请联系:TEL:199 18 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务