收藏 分享(赏)

C第5章C面向对象编程基础PPT课件.ppt

上传人:Facebook 文档编号:3833808 上传时间:2018-11-20 格式:PPT 页数:48 大小:871.50KB
下载 相关 举报
C第5章C面向对象编程基础PPT课件.ppt_第1页
第1页 / 共48页
C第5章C面向对象编程基础PPT课件.ppt_第2页
第2页 / 共48页
C第5章C面向对象编程基础PPT课件.ppt_第3页
第3页 / 共48页
C第5章C面向对象编程基础PPT课件.ppt_第4页
第4页 / 共48页
C第5章C面向对象编程基础PPT课件.ppt_第5页
第5页 / 共48页
点击查看更多>>
资源描述

1、C#面向对象程序设计,主讲教师:胡 鹏 飞 个人邮箱: 教学邮箱:,2,我学习我快乐!我快乐我学习!,5.1 继承 5.2 抽象类与密封类 5.3 多态性,第5章 C#面向对象编程基础,3,我学习我快乐!我快乐我学习!,5.1 继承,5.1.1 继承的定义5.1.2 覆盖5.1.3 .NET Framework中重要的类5.1.4 泛型,4,我学习我快乐!我快乐我学习!,5.1 继承,继承是面向对象程序设计的主要特征之一,它可以让您重用代码,可以节省程序设计的时间。继承就是在类之间建立一种相交关系,使得新定义的派生类的实例可以继承已有的基类的特征和能力,而且可以加入新的特性或者是修改已有的特性

2、建立起类的新层次。 现实世界中的许多实体之间不是相互孤立的,它们往往具有共同的特征也存在内在的差别。人们可以采用层次结构来描述这些实体之间的相似之处和不同之处。,5,我学习我快乐!我快乐我学习!,6,我学习我快乐!我快乐我学习!,5.1 继承,对类进一步细化,从而派生为更具体详细的类,派生类除自动具有基类中的所有成员以外,还可以添加自己所特有的属性和行为,并可根据需要修改基类中个别行为的具体实现。继承体现了一般/特殊关系(派生类是基类的细化),保证了层次结构的清晰性,且体现了模型/代码重用的原则,体现了分类学基本方法。 继承具有级联效应。修改基类成员会影响其派生类。,7,我学习我快乐!我快乐我

3、学习!,5.1.1 继承的定义,从一个基类派生一个子类的语法是:类修饰符 class 类名:基类类名类的成员;需要使用冒号(:),后跟基类的名字。冒号的意思相当于“派生于”。 参看li5-1,P33,8,我学习我快乐!我快乐我学习!,5.1.1 继承的定义,一个类能够从基类继承成员。关于继承,需要注意以下几个重要的方面:继承是可传递的。如果B派生于A,并且C派生于B,那么C就继承了B中声明的成员,同时也继承了A中声明的成员。 派生类能够扩展它的基类。派生类可以添加同它继承的成员一样的新成员,但是这不能去掉一个继承的成员的定义。,9,我学习我快乐!我快乐我学习!,5.1.1 继承的定义,不管它们

4、是否声明了可访问性,构造函数和析构函数总是不能被继承。 派生类可以通过用相同的名称和签名,声明一个新的成员方法来覆盖继承的成员。 类可以声明虚拟方法、属性和索引,并且派生类可以覆盖这些功能成员的执行。这使得类可以展示多态性,此行为被功能成员调用实现,而这个调用则要根据实例运行时的类型,调用不同的方法成员。,10,我学习我快乐!我快乐我学习!,保护成员保护成员通过在成员声明中使用protected修饰符来定义。为了方便派生类的访问,但又不希望其他无关类随意访问,这时就可以使用protected修饰符,将成员声明为保护的。,保护成员,为什么引入保护成员这个概念?,P29,11,我学习我快乐!我快乐

5、我学习!,5.1.2 覆盖,覆盖(override)当在子类中声明了与基类相同名字的方法,而且,使用了相同的签名时,就称派生类的成员覆盖了基类中的成员。C#中,基类中的功能成员默认为不可覆盖的,除非使用了virtual修饰。派生类中若要覆盖相同签名的基类功能成员,必须使用override修饰且重新定义其实现。即使派生类覆盖了基类功能成员,仍能使用“base.成员名”来访问被覆盖的功能成员。,P33,12,我学习我快乐!我快乐我学习!,示例5-2类图,13,我学习我快乐!我快乐我学习!,5.1.2 覆盖,覆盖(override)和重载(overload)。重载它是指允许存在多个同名函数,而这些函

6、数的签名不同(或许参数个数不同,或许参数类型不同,或许两者都不同),从而能够处理方法的参数不同但操作相同的情况。覆盖是指子类重新定义基类的虚函数,二者具有相同的签名,它是面向对象中多态的基础。 派生类中可以同时对基类中的功能成员进行重载和覆盖。不能覆盖类的静态成员。,14,我学习我快乐!我快乐我学习!,new关键字 我们可以在派生类中定义新的成员方法,但如果无意中恰好定义了一个和基类完全一样的方法,怎么办?new关键字用来在派生类中隐藏从基类中继承的单个成员。参看例子5-2。,P34,15,我学习我快乐!我快乐我学习!,override和new的区别?,override 表示重写,用于继承类对

7、基类中虚成员的实现。 new 表示隐藏,声明类的成员,表示隐藏了基类中同名的成员 。,16,我学习我快乐!我快乐我学习!,1 Object类,所有.NET类都派生于System.Object类。在C#中在定义类时若没有指定基类,编译器自动假设这个类派生于System.Object类。System.Object类就成为C#中所以类的根。,5.1.3 .NET Framework中重要的类,P26,17,我学习我快乐!我快乐我学习!,Object类常用方法,1)public virtual string ToString() 返回对象的字符串表示方式2)public virtual bool Eq

8、uals(object obj) 对对象的实例进行比较3)public static bool Equals(object objA, object objB) 对对象的实例进行比较4)public static bool ReferenceEquals(object objA,object objB) 比较两个引用是否指向同一对象5)public Type GetType() 返回对象类型的详细信息,参看Li5-3,18,我学习我快乐!我快乐我学习!,装箱(boxing)和拆箱(unboxing)是C#类型系统中重要的概念。它允许将任何类型的数据转换为对象(object),同时也允许任何类型

9、的对象转换到与之兼容的数据类型,其实拆箱是装箱的逆过程。 1装箱转换 装箱转换是指将一个值类型的数据隐式地转换成一个对象类型(object)的数据。把一个值类型装箱,就是创建一个object类型的实例,并把该值类型的值复制给该这个object。 例如:下面的两条语句就执行了装箱转换: int k=100; object obj=k; 上面的两条语句中,第1条语句先声明一个整型变量k并对其赋值,第2条语句则先创建一个object类型的实例obj,然后将k的值复制给obj。,装箱和拆箱,19,我学习我快乐!我快乐我学习!,在执行装箱转换时,也可以使用显式转换,如: int k=100; objec

10、t obj=(object) k;例:在程序中执行装箱转换,程序代码如下:using System;class BoxingDemo static void Main( ) Console.WriteLine(“执行装箱转换:“);int k=200;object obj=k;k=300;Console.WriteLine(“obj=0“,obj);Console.WriteLine(“k=0“, k); 装箱的作用就是使类型统一. 参看li5-4,装箱和拆箱,20,我学习我快乐!我快乐我学习!,2拆箱转换是指将一个对象类型的数据显式地转换成一个值类型数据。拆箱操作包括分为两步:首先检查对象实

11、例,确保它是给定值类型的一个装箱值,然后把实例的值复制到值类型数据中。例如:下面两条语句就执行了拆箱转换:object obj=228;int k=(int)obj;拆箱转换需要(而且必须)执行显式转换,这是它与装箱转换的不同之处。,装箱和拆箱,21,我学习我快乐!我快乐我学习!,例:在程序中使用拆箱转换,程序代码如下:using Systemclass UnboxingDemostatic void Main( )int k=228;object obj=k; /装箱转换int j=(int ) obj; /拆箱转换Console.WriteLine(“k=0tobj=1tj=2“, k,

12、obj, j); 注意:装箱与拆箱转换是要损失性能的。,装箱和拆箱,22,我学习我快乐!我快乐我学习!,5.1.3 .NET Framework中重要的类,String类String类是直接从object派生的封装好的类类型,字符串类的实例表示统一的字符编码标准字符串,它的功能非常强大、用途非常广泛。,23,我学习我快乐!我快乐我学习!,String类,System.String类专门用于存储字符串,允许对字符串进行许多操作。由于这种数据类型非常重要,C#提供了它自己的关键字:string,以便更容易的处理字符串,string关键字是预定义System.String类的简化的别名。String

13、类提供了许多方法,可以实现例如替换字符、删除空白和把字符变成大写形式等功能。,P65,24,我学习我快乐!我快乐我学习!,String类的方法,CompareTo 已重载。将此实例与指定的对象进行比较。 Concat 已重载。连接 String 的一个或多个实例,或 Object 的一个或多个实例的值的 String 表示形式。 Copy 创建一个与指定的 String 具有相同值的 String 的新实例。 CopyTo 将指定数目的字符从此实例中的指定位置复制到 Unicode 字符数组中的指定位置。,25,我学习我快乐!我快乐我学习!,String类的方法,IndexOf 已重载。报告

14、String 在此实例中的第一个匹配项的索引或一个或多个字符的索引。 IndexOfAny 已重载。报告指定 Unicode 字符数组中的任意字符在此实例中第一个匹配项的索引。 LastIndexOf 已重载。报告指定的 Unicode 字符或 String 在此实例中的最后一个匹配项的索引位置。,26,我学习我快乐!我快乐我学习!,String类的方法,Substring 已重载。从此实例检索子字符串。 ToLower 已重载。返回此 String 的小写形式的副本。 ToUpper 已重载。返回此 String 的大写形式的副本。 Trim 已重载。从此实例的开始位置和末尾移除一组指定字符

15、的所有匹配项。,27,我学习我快乐!我快乐我学习!,StringBuilder类,StringBuilder类表示可变字符串,功能不如String类强大,但StringBuilder类通过分配的内存比需要的多,多数操作在内存中进行,因此在进行替换、添加、插入或删除字符串中的文本时效率非常高。String 对象是不可改变的。每次使用 System.String 类中的方法之一或进行运算时(如赋值、拼接等)时,都要在内存中创建一个新的字符串对象,这就需要为该新对象分配新的空间。,P75,28,我学习我快乐!我快乐我学习!,StringBuilder类,而 StringBuilder 则不会。在需要

16、对字符串执行重复修改的情况下,与创建新的 String 对象相关的系统开销可能会非常昂贵。如果要修改字符串而不创建新的对象,则可以使用 System.Text.StringBuilder 类。例如,当在一个循环中将许多字符串连接在一起时,使用 StringBuilder 类可以提升性能。,参看li5-6,29,我学习我快乐!我快乐我学习!,3 ArrayList类 ArrayList类与数组类似,但是有如下优点: 数组要想改变大小,必须重建一个数组,复制现有元素,然后对数组引用进行更新。但ArrayList不用,它可以是不定大小的。 如果要从数组中移除一个元素,必须创建元素复本,然后将删除位置

17、后的所有元素向前移动一个位置。 ArrayList不用,直接调用它的移除函数即可。 如果数组插入时,需要将插入位置后的所有元素都向后移动,空出空间给新插入的元素。而ArrayList直接调用它的插入函数即可。 注意引入 System.Collections命名空间,5.1.3 .NET Framework中重要的类,P50,30,我学习我快乐!我快乐我学习!,ArrayList类的方法,Add 将对象添加到 ArrayList 的结尾处。 Insert 将元素插入 ArrayList 的指定索引处。 Remove 从 ArrayList 中移除特定对象的第一个匹配项。 RemoveAt 移除

18、ArrayList 的指定索引处的元素。 IndexOf 返回 ArrayList 或它的一部分中某个值的第一个匹配项的从零开始的索引。 Sort 对 ArrayList 或它的一部分中的元素进行排序。 Clear 从 ArrayList 中移除所有元素。参看li5-7,31,我学习我快乐!我快乐我学习!,4.Queue类Queue类表示对象的先进先出集合。 Queue类常见操作 Enqueue 将对象添加到 Queue 的结尾处。 Dequeue 移除并返回位于 Queue 开始处的对象。 Peek 返回位于 Queue 开始处的对象但不将其移除。 Clear 从 Queue 中移除所有对象

19、。,5.1.3 .NET Framework中重要的类,参看li5-8,32,我学习我快乐!我快乐我学习!,5.Stack类Stack类表示对象的先进先出集合。 Stack类常见操作 Push 将对象插入 Stack 的顶部。 Pop 移除并返回位于 Stack 顶部的对象。 Peek 返回位于 Queue 开始处的对象但不将其移除。 Clear 从 Stack 中移除所有对象。,5.1.3 .NET Framework中重要的类,参看li5-9,33,我学习我快乐!我快乐我学习!,5. Hashtable类Hashtable类表示键/值对的集合,这些键/值对根据键的哈希代码进行组织。 Has

20、htable类常见操作 Add 将带有指定键和值的元素添加到 Hashtable 中。 Remove 从 Hashtable 中移除带有指定键的元素。 Clear 从 Hashtable 中移除所有对象。,5.1.3 .NET Framework中重要的类,参看li5-10,34,我学习我快乐!我快乐我学习!,6. SortedList 类SortedList 类表示键/值对的集合,这些键值对按键排序并可按照键和索引访问。 SortedList类的重要属性 Count 获取包含在 SortedList元素的数目。 Capacity 获取或设置 SortedList 的容量。 Keys 获取 S

21、ortedList 中的键。 Values 获取 SortedList 中的值。,5.1.3 .NET Framework中重要的类,参看li5-11,35,我学习我快乐!我快乐我学习!,SortedList类常见操作 Add 将带有指定键和值的元素添加到 SortedList。 Remove 从 Hashtable 中移除带有指定键的元素。 GetByIndex 获取 SortedList 的指定索引处的值。 SetByIndex 替换 SortedList 中指定索引处的值。 GetKey 获取 SortedList 的指定索引处的键。 IndexOfKey 返回 SortedList 中

22、指定键的从零开始的索引。 IndexOfValue 返回指定的值在 SortedList 中第一个匹配项的从零开始的索引。 Clear 从 Hashtable 中移除所有对象。,5.1.3 .NET Framework中重要的类,参看li5-11,36,我学习我快乐!我快乐我学习!,5.1.4 泛型,所谓泛型:即通过参数化类型来实现在同一份代码上操作多种数据类型。泛型编程是一种编程范式,它利用“参数化类型”将类型抽象化,从而实现更为灵活的复用。 C#泛型赋予了代码更强的类型安全,更好的复用,更高的效率,更清晰的约束。参看li5-12,37,我学习我快乐!我快乐我学习!,上机作业,按下面的类图实

23、现代码,38,我学习我快乐!我快乐我学习!,5.2 抽象类和密封类,5.2.1 抽象类5.2.2 密封类,39,我学习我快乐!我快乐我学习!,5.2.1 抽象类:abstract,抽象类是基类的一种特殊类型。除了拥有普通的类成员之外,还有抽象类成员。抽象类成员中的方法和属性,只有声明(使用关键字abstract),而没有实现部分。由于对实例而言,没有实现的成员是不合法的,所以抽象类永远也不能实例化。,P35,40,我学习我快乐!我快乐我学习!,5.2.1 抽象类:abstract,这种不能实例化的类也有它的作用空间,它们可以在类层次结构的上层,对于派生于该类的其他类而言,抽象类就确定了子类的基

24、本结构和意义,从而使程序框架更容易建立。抽象类不能实例化。抽象类的用途是提供多个派生类可共享的基类的公共定义。,41,我学习我快乐!我快乐我学习!,5.2.1 抽象类,包含一个或多个抽象方法的类必须声明为abstract,但是,抽象类可以包含非抽象的成员。从抽象类派生的类必须对基类中包含的所有抽象方法提供实现过程,否则,它也为抽象类。抽象函数为隐式的虚函数,所以为继承的抽象类提供了实现代码的方式与覆盖一个虚方法相似。抽象方法没有实现,所以方法定义后面是分号,而不是常规的方法块。抽象类的派生类必须实现所有抽象方法。当抽象类从基类继承虚方法时,抽象类可以使用抽象方法重写该虚方法。,42,我学习我快

25、乐!我快乐我学习!,5.2.2 密封类:sealed,继承是非常有用的,但有时候,我们并不希望自己编写的类被继承,或者已经认定没有必要继承了,为了防止无意的错误继承,C#提出了密封类(sealed class)的概念。类声明为密封后,就不能用来派生新的类。,P35,43,我学习我快乐!我快乐我学习!,5.2.2 密封类,注意:不能同时使用abstract和sealed修饰一个类,并且在sealed类中,也不能有抽象方法。即sealed类中所有成员均已实现。,44,我学习我快乐!我快乐我学习!,5.3 多态(Polymorphism),5.3.1 理解多态5.3.2 实现多态,45,我学习我快乐

26、!我快乐我学习!,5.3.1 理解多态,当派生类重新定义了基类的虚拟方法后,基类根据赋给它的不同的派生类引用,动态地调用属于派生类的对应方法,这样的方法调用在编译期间是无法确定的。因此,这样的方法地址是在运行期绑定的(动态邦定)。,P40,46,我学习我快乐!我快乐我学习!,5.3.2 实现多态,在基类中使用virtual或abstract修饰功能成员,在派生类中使用override修饰该成员,且允许修改其具体实现。参看li-13,47,我学习我快乐!我快乐我学习!,上机作业,由Teacher类派生出小学教师类,中学教师类,大学教师类;这三个子类都覆盖基类的Teach()方法。在Main()方法中自己编写一段代码体现类的多态性。请参考示例5-13.,Thank You !,

展开阅读全文
相关资源
猜你喜欢
相关搜索

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

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报