C#第5章C#面向对象编程基础.ppt_第1页
C#第5章C#面向对象编程基础.ppt_第2页
C#第5章C#面向对象编程基础.ppt_第3页
C#第5章C#面向对象编程基础.ppt_第4页
C#第5章C#面向对象编程基础.ppt_第5页
已阅读5页,还剩43页未读 继续免费阅读

下载本文档

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

文档简介

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 继承,继承是面向对象程序设计的主要特征之一,它可以让您重用代码,可以节省程序设计的时间。继承就是在类之间建立一种相交关系,使得新定义的派生类的实例可以继承已有的基类的特征和能力,而且可以加入新的特性或者是修改已有的特性建立起类的新层次。 现实世界中的许多实体之间不是相互孤立的,它们往往具有共同的特征也存在内在的差别。人们可以采用层次结构来描述这些实体之间的相似之处和不同之处。,5,我学习我快乐!我快乐我学习!,6,我学习我快乐!我快乐我学习!,5.1 继承,对类进一步细化,从而派生为更具体详细的类,派生类除自动具有基类中的所有成员以外,还可以添加自己所特有的属性和行为,并可根据需要修改基类中个别行为的具体实现。 继承体现了一般/特殊关系(派生类是基类的细化),保证了层次结构的清晰性,且体现了模型/代码重用的原则,体现了分类学基本方法。 继承具有级联效应。修改基类成员会影响其派生类。,7,我学习我快乐!我快乐我学习!,5.1.1 继承的定义,从一个基类派生一个子类的语法是: 类修饰符 class 类名:基类类名 类的成员; 需要使用冒号(:),后跟基类的名字。冒号的意思相当于“派生于”。 参看li5-1,P33,8,我学习我快乐!我快乐我学习!,5.1.1 继承的定义,一个类能够从基类继承成员。关于继承,需要注意以下几个重要的方面: 继承是可传递的。如果B派生于A,并且C派生于B,那么C就继承了B中声明的成员,同时也继承了A中声明的成员。 派生类能够扩展它的基类。派生类可以添加同它继承的成员一样的新成员,但是这不能去掉一个继承的成员的定义。,9,我学习我快乐!我快乐我学习!,5.1.1 继承的定义,不管它们是否声明了可访问性,构造函数和析构函数总是不能被继承。 派生类可以通过用相同的名称和签名,声明一个新的成员方法来覆盖继承的成员。 类可以声明虚拟方法、属性和索引,并且派生类可以覆盖这些功能成员的执行。这使得类可以展示多态性,此行为被功能成员调用实现,而这个调用则要根据实例运行时的类型,调用不同的方法成员。,10,我学习我快乐!我快乐我学习!,保护成员 保护成员通过在成员声明中使用protected修饰符来定义。为了方便派生类的访问,但又不希望其他无关类随意访问,这时就可以使用protected修饰符,将成员声明为保护的。,保护成员,为什么引入保护成员这个概念?,P29,11,我学习我快乐!我快乐我学习!,5.1.2 覆盖,覆盖(override) 当在子类中声明了与基类相同名字的方法,而且,使用了相同的签名时,就称派生类的成员覆盖了基类中的成员。 C#中,基类中的功能成员默认为不可覆盖的,除非使用了virtual修饰。派生类中若要覆盖相同签名的基类功能成员,必须使用override修饰且重新定义其实现。 即使派生类覆盖了基类功能成员,仍能使用“base.成员名”来访问被覆盖的功能成员。,P33,12,我学习我快乐!我快乐我学习!,示例5-2类图,13,我学习我快乐!我快乐我学习!,5.1.2 覆盖,覆盖(override)和重载(overload)。 重载它是指允许存在多个同名函数,而这些函数的签名不同(或许参数个数不同,或许参数类型不同,或许两者都不同),从而能够处理方法的参数不同但操作相同的情况。 覆盖是指子类重新定义基类的虚函数,二者具有相同的签名,它是面向对象中多态的基础。 派生类中可以同时对基类中的功能成员进行重载和覆盖。 不能覆盖类的静态成员。,14,我学习我快乐!我快乐我学习!,new关键字 我们可以在派生类中定义新的成员方法,但如果无意中恰好定义了一个和基类完全一样的方法,怎么办? new关键字用来在派生类中隐藏从基类中继承的单个成员。 参看例子5-2。,P34,15,我学习我快乐!我快乐我学习!,override和new的区别?,override 表示重写,用于继承类对基类中虚成员的实现。 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 Equals(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),同时也允许任何类型的对象转换到与之兼容的数据类型,其实拆箱是装箱的逆过程。 1装箱转换 装箱转换是指将一个值类型的数据隐式地转换成一个对象类型(object)的数据。把一个值类型装箱,就是创建一个object类型的实例,并把该值类型的值复制给该这个object。 例如:下面的两条语句就执行了装箱转换: int k=100; object obj=k; 上面的两条语句中,第1条语句先声明一个整型变量k并对其赋值,第2条语句则先创建一个object类型的实例obj,然后将k的值复制给obj。,装箱和拆箱,19,我学习我快乐!我快乐我学习!,在执行装箱转换时,也可以使用显式转换,如: int k=100; object 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拆箱转换 是指将一个对象类型的数据显式地转换成一个值类型数据。 拆箱操作包括分为两步:首先检查对象实例,确保它是给定值类型的一个装箱值,然后把实例的值复制到值类型数据中。 例如:下面两条语句就执行了拆箱转换: object obj=228; int k=(int)obj; 拆箱转换需要(而且必须)执行显式转换,这是它与装箱转换的不同之处。,装箱和拆箱,21,我学习我快乐!我快乐我学习!,例:在程序中使用拆箱转换,程序代码如下: using System class UnboxingDemo static void Main( ) int k=228; object obj=k; /装箱转换 int j=(int ) obj; /拆箱转换 Console.WriteLine(“k=0tobj=1tj=2“, k, obj, j); 注意:装箱与拆箱转换是要损失性能的。,装箱和拆箱,22,我学习我快乐!我快乐我学习!,5.1.3 .NET Framework中重要的类,String类 String类是直接从object派生的封装好的类类型,字符串类的实例表示统一的字符编码标准字符串,它的功能非常强大、用途非常广泛。,23,我学习我快乐!我快乐我学习!,String类,System.String类专门用于存储字符串,允许对字符串进行许多操作。由于这种数据类型非常重要,C#提供了它自己的关键字:string,以便更容易的处理字符串,string关键字是预定义System.String类的简化的别名。 String类提供了许多方法,可以实现例如替换字符、删除空白和把字符变成大写形式等功能。,P65,24,我学习我快乐!我快乐我学习!,String类的方法,CompareTo 已重载。将此实例与指定的对象进行比较。 Concat 已重载。连接 String 的一个或多个实例,或 Object 的一个或多个实例的值的 String 表示形式。 Copy 创建一个与指定的 String 具有相同值的 String 的新实例。 CopyTo 将指定数目的字符从此实例中的指定位置复制到 Unicode 字符数组中的指定位置。,25,我学习我快乐!我快乐我学习!,String类的方法,IndexOf 已重载。报告 String 在此实例中的第一个匹配项的索引或一个或多个字符的索引。 IndexOfAny 已重载。报告指定 Unicode 字符数组中的任意字符在此实例中第一个匹配项的索引。 LastIndexOf 已重载。报告指定的 Unicode 字符或 String 在此实例中的最后一个匹配项的索引位置。,26,我学习我快乐!我快乐我学习!,String类的方法,Substring 已重载。从此实例检索子字符串。 ToLower 已重载。返回此 String 的小写形式的副本。 ToUpper 已重载。返回此 String 的大写形式的副本。 Trim 已重载。从此实例的开始位置和末尾移除一组指定字符的所有匹配项。,27,我学习我快乐!我快乐我学习!,StringBuilder类,StringBuilder类表示可变字符串,功能不如String类强大,但StringBuilder类通过分配的内存比需要的多,多数操作在内存中进行,因此在进行替换、添加、插入或删除字符串中的文本时效率非常高。 String 对象是不可改变的。每次使用 System.String 类中的方法之一或进行运算时(如赋值、拼接等)时,都要在内存中创建一个新的字符串对象,这就需要为该新对象分配新的空间。,P75,28,我学习我快乐!我快乐我学习!,StringBuilder类,而 StringBuilder 则不会。在需要对字符串执行重复修改的情况下,与创建新的 String 对象相关的系统开销可能会非常昂贵。如果要修改字符串而不创建新的对象,则可以使用 System.Text.StringBuilder 类。例如,当在一个循环中将许多字符串连接在一起时,使用 StringBuilder 类可以提升性能。,参看li5-6,29,我学习我快乐!我快乐我学习!,3 ArrayList类 ArrayList类与数组类似,但是有如下优点: 数组要想改变大小,必须重建一个数组,复制现有元素,然后对数组引用进行更新。但ArrayList不用,它可以是不定大小的。 如果要从数组中移除一个元素,必须创建元素复本,然后将删除位置后的所有元素向前移动一个位置。 ArrayList不用,直接调用它的移除函数即可。 如果数组插入时,需要将插入位置后的所有元素都向后移动,空出空间给新插入的元素。而ArrayList直接调用它的插入函数即可。 注意引入 System.Collections命名空间,5.1.3 .NET Framework中重要的类,P50,30,我学习我快乐!我快乐我学习!,ArrayList类的方法,Add 将对象添加到 ArrayList 的结尾处。 Insert 将元素插入 ArrayList 的指定索引处。 Remove 从 ArrayList 中移除特定对象的第一个匹配项。 RemoveAt 移除 ArrayList 的指定索引处的元素。 IndexOf 返回 ArrayList 或它的一部分中某个值的第一个匹配项的从零开始的索引。 Sort 对 ArrayList 或它的一部分中的元素进行排序。 Clear 从 ArrayList 中移除所有元素。 参看li5-7,31,我学习我快乐!我快乐我学习!,4.Queue类 Queue类表示对象的先进先出集合。 Queue类常见操作 Enqueue 将对象添加到 Queue 的结尾处。 Dequeue 移除并返回位于 Queue 开始处的对象。 Peek 返回位于 Queue 开始处的对象但不将其移除。 Clear 从 Queue 中移除所有对象。,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类表示键/值对的集合,这些键/值对根据键的哈希代码进行组织。 Hashtable类常见操作 Add 将带有指定键和值的元素添加到 Hashtable 中。 Remove 从 Hashtable 中移除带有指定键的元素。 Clear 从 Hashtable 中移除所有对象。,5.1.3 .NET Framework中重要的类,参看li5-10,34,我学习我快乐!我快乐我学习!,6. SortedList 类 SortedList 类表示键/值对的集合,这些键值对按键排序并可按照键和索引访问。 SortedList类的重要属性 Count 获取包含在 SortedList元素的数目。 Capacity 获取或设置 SortedList 的容量。 Keys 获取 SortedList 中的键。 Values 获取 SortedList 中的值。,5.1.3 .NET Framework中重要的类,参看li5-11,35,我学习我快乐!我快乐我学习!,SortedList类常见操作 Add 将带有指定键和值的元素添加到 SortedList。 Remove 从 Hashtable 中移除带有指定键的元素。 GetByIndex 获取 SortedList 的指定索引处的值。 SetByIndex 替换 SortedList 中指定索引处的值。 GetKey 获取 SortedList 的指定索引处的键。 IndexOfKey 返回 SortedList 中指定键的从零开始的索引。 IndexOfValue 返回指定的值在 SortedList 中第一个匹配项的从零开始的索引。 Clear 从 Hashtable 中移除所有对象。,5.1.3 .NET Framework中重要的类,参看li5-11,36,我学习我快乐!我快乐我学习!,5.1.4 泛型,所谓泛型:即通过参数化类型来实现在同一份代码上操作多种数据类型。泛型编程是一种编程范式,它利用“参数化类型”将类型抽象化,从而实现更为灵活的复用。 C#泛型赋予了代码更强的类型安全,更好的复用,更高的效率,更清晰的约束。 参看li5-12,37,我学习我快乐!我快乐我学习!,上机作业,按下面的类图实现代码,38,我学习我快乐!我快乐我学习!,5.2 抽象类和密封类,5.2.1 抽象类 5.2.2 密封类,39,我学习我快乐!我快乐我学习!,5.2.1 抽象类:abstract,抽象类是基类的一种特殊类型。除了拥有普通的类成员之外,还有抽象类成员。抽象类成员中的方法和属性,只有声明(使用关键字abstract),而没有实现部分。由于对实例而言,没有实现的成员是不合法的,所以抽象类永远也不能实例化。,P35,40,我学习我快乐!我快乐我学习!,5.2.1 抽象类:abstract,这种不能实例化的类也有它的作用空间,它们可以在类层次结构的上层,对于派生于该类的其他类而言,抽象类就确定了子类的基本结构和意义,从而使程序框架更容易建立。 抽象类不能实例化。抽象类的用途是提供多个派生类可共享的基类的公共定义。,41,我学习我快乐!我快乐我学习!,5.2.1 抽象类,包含一个或多个抽象方法的类必须声明为abstract,但是,抽象类可以包含非抽象的成员。从抽象类派生的类必须对基类中包含的所有抽象方法提供

温馨提示

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

评论

0/150

提交评论