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#面向对象程序设计,主讲教师:胡鹏飞个人邮箱:hpf126教学邮箱:xxu2009,2,我学习我快乐!我快乐我学习!,5.1继承5.2抽象类与密封类5.3多态性,第5章C#面向对象编程基础,3,我学习我快乐!我快乐我学习!,5.1继承,5.1.1继承的定义5.1.2覆盖5.1.3.NETFramework中重要的类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,我学习我快乐!我快乐我学习!,1Object类,所有.NET类都派生于System.Object类。在C#中在定义类时若没有指定基类,编译器自动假设这个类派生于System.Object类。System.Object类就成为C#中所以类的根。,5.1.3.NETFramework中重要的类,P26,17,我学习我快乐!我快乐我学习!,Object类常用方法,1)publicvirtualstringToString()返回对象的字符串表示方式2)publicvirtualboolEquals(objectobj)对对象的实例进行比较3)publicstaticboolEquals(objectobjA,objectobjB)对对象的实例进行比较4)publicstaticboolReferenceEquals(objectobjA,objectobjB)比较两个引用是否指向同一对象5)publicTypeGetType()返回对象类型的详细信息,参看Li5-3,18,我学习我快乐!我快乐我学习!,装箱(boxing)和拆箱(unboxing)是C#类型系统中重要的概念。它允许将任何类型的数据转换为对象(object),同时也允许任何类型的对象转换到与之兼容的数据类型,其实拆箱是装箱的逆过程。1装箱转换装箱转换是指将一个值类型的数据隐式地转换成一个对象类型(object)的数据。把一个值类型装箱,就是创建一个object类型的实例,并把该值类型的值复制给该这个object。例如:下面的两条语句就执行了装箱转换:intk=100;objectobj=k;上面的两条语句中,第1条语句先声明一个整型变量k并对其赋值,第2条语句则先创建一个object类型的实例obj,然后将k的值复制给obj。,装箱和拆箱,19,我学习我快乐!我快乐我学习!,在执行装箱转换时,也可以使用显式转换,如:intk=100;objectobj=(object)k;例:在程序中执行装箱转换,程序代码如下:usingSystem;classBoxingDemostaticvoidMain()Console.WriteLine(执行装箱转换:);intk=200;objectobj=k;k=300;Console.WriteLine(obj=0,obj);Console.WriteLine(k=0,k);装箱的作用就是使类型统一.参看li5-4,装箱和拆箱,20,我学习我快乐!我快乐我学习!,2拆箱转换是指将一个对象类型的数据显式地转换成一个值类型数据。拆箱操作包括分为两步:首先检查对象实例,确保它是给定值类型的一个装箱值,然后把实例的值复制到值类型数据中。例如:下面两条语句就执行了拆箱转换:objectobj=228;intk=(int)obj;拆箱转换需要(而且必须)执行显式转换,这是它与装箱转换的不同之处。,装箱和拆箱,21,我学习我快乐!我快乐我学习!,例:在程序中使用拆箱转换,程序代码如下:usingSystemclassUnboxingDemostaticvoidMain()intk=228;objectobj=k;/装箱转换intj=(int)obj;/拆箱转换Console.WriteLine(k=0tobj=1tj=2,k,obj,j);注意:装箱与拆箱转换是要损失性能的。,装箱和拆箱,22,我学习我快乐!我快乐我学习!,5.1.3.NETFramework中重要的类,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,我学习我快乐!我快乐我学习!,3ArrayList类ArrayList类与数组类似,但是有如下优点:数组要想改变大小,必须重建一个数组,复制现有元素,然后对数组引用进行更新。但ArrayList不用,它可以是不定大小的。如果要从数组中移除一个元素,必须创建元素复本,然后将删除位置后的所有元素向前移动一个位置。ArrayList不用,直接调用它的移除函数即可。如果数组插入时,需要将插入位置后的所有元素都向后移动,空出空间给新插入的元素。而ArrayList直接调用它的插入函数即可。注意引入System.Collections命名空间,5.1.3.NETFramework中重要的类,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.NETFramework中重要的类,参看li5-8,32,我学习我快乐!我快乐我学习!,5.Stack类Stack类表示对象的先进先出集合。Stack类常见操作Push将对象插入Stack的顶部。Pop移除并返回位于Stack顶部的对象。Peek返回位于Queue开始处的对象但不将其移除。Clear从Stack中移除所有对象。,5.1.3.NETFramework中重要的类,参看li5-9,33,我学习我快乐!我快乐我学习!,5.Hashtable类Hashtable类表示键/值对的集合,这些键/值对根据键的哈希代码进行组织。Hashtable类常见操作Add将带有指定键和值的元素添加到Hashtable中。Remove从Hashtable中移除带有指定键的元素。Clear从Hashtable中移除所有对象。,5.1.3.NETFramework中重要的类,参看li5-10,34,我学习我快乐!我快乐我学习!,6.SortedList类SortedList类表示键/值对的集合,这些键值对按键排序并可按照键和索引访问。SortedList类的重要属性Count获取包含在SortedList元素的数目。Capacity获取或设置SortedList的容量。Keys获取SortedList中的键。Values获取SortedList中的值。,5.1.3.NETFramework中重要的类,参看li5-11,35,我学习我快乐!我快乐我学习!,SortedList类常见操作Add将带有指定键和值的元素添加到SortedList。Remove从Hashtable中移除带有指定键的元素。GetByIndex获取SortedList的指定索引处的值。SetByIndex替换SortedList中指定索引处的值。GetKey获取SortedList的指定索引处的键。IndexOfKey返回SortedList中指定键的从零开始的索引。IndexOfValue返回指定的值在SortedList中第一个匹配项的从零开始的索引。Clear从Hashtable中移除所有对象。,5.1.3.NETFramework中重要的类,参看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

提交评论