CS2005_CH06.ppt_第1页
CS2005_CH06.ppt_第2页
CS2005_CH06.ppt_第3页
CS2005_CH06.ppt_第4页
CS2005_CH06.ppt_第5页
已阅读5页,还剩49页未读 继续免费阅读

下载本文档

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

文档简介

1、第6章面向对象的高级应用,Visual C# 2005程序设计语言,第1章: 概述 第 2 章:C#与Visual Studio 2005 第 3 章:变量、数据类型和表达式 第 4 章:分支和循环 第 5 章:面向对象 第 6 章:面向对象的高级应用,第 7 章:程序的生成、调试和异常处理 第 8 章:数组与字符串 第 9 章:基于 Windows 的应用程序 第 10 章:创建 Web 应用程序 第 11 章:.NET Framework 2.0 简介,本章学习目标: 理解并使用继承 理解并使用多态性 理解重写的概念 理解接口的概念,目标,继承性 多态性 接口 小结 实验 习题,第6章 面

2、向对象的高级应用,继承性,6.1继承性,继承是指派生类可以获得其基类(此基类本身也可以是派生类)特征的能力。继承允许把行为的公共集合(定义为属性和方法)包含在基类中,这些公共集合可以在基类的派生类中得到重用。利用继承性,可以以现有的通用类型为基础,创建出新的特殊类型。,继承性 (续),6.1继承性,继承性:,优点:继承最主要的优点就是代码重用,继承层次结构 :这个结构中的每个类都继承自该结构中上一层的类,不使用继承 :代码会存在重复,派生类 在派生类中调用基类构造函数 密封类,继承性 (续),6.1 继承性,派生类,6.1.1 派生类,语法 创建派生类的语法如下: attributes acc

3、ess-modifiers class identifiers :base-class class-body,派生类(续),6.1.1 派生类,在应用程序中要避免过度使用继承。,任何没有被密封的类都可以被其他类继承,因此派生类可以被其他类继承。,设计注意事项,派生类(续),6.1.1 派生类,访问修饰符“protected”可以将类成员的作用域限制在本类及其派生类中。,Protected 访问修饰符,在派生类中调用基类构造函数,6.1.2 在派生类中调用 基类构造函数,执行顺序 因为派生类要使用基类,所以基类实例化必须在派生类实例化之前进行。,调用特定的构造函数 如果想要调用基类的非默认构造函

4、数,那么必须使用 base 关键字。,密封类,6.1.3 密封类,在 C# 中,有一种类称为密封类。当把某个类声明为密封类时,编译器将禁止所有类继承该类。 一般情况下,类是不“密封的”,因为一旦把某个类声明为密封类,这个类将永远不能再扩展了。但是,如果某个类具有特殊的实现,并且不允许其他任何类继承该类,那么就需要把此类声明为密封类。,继承性 多态性 接口 小结 实验 习题,第6章 面向对象的高级应用,多态性,6.2 多态性,多态性是一个面向对象的概念,它允许以相似的方式来对待所有派生类,尽管这些派生类是各不相同的。创建派生类的目的是为了获得更多的特殊功能。,多态性(续),6.2 多态性,编写虚

5、方法 抽象方法和抽象类,编写虚方法,6.2.1 编写虚方法,virtual 关键字 override 关键字 调用虚方法 在派生类中使用基类成员,virtual 关键字,虚方法的定义要用到virtual关键字 ,如下所示: public class Animal public virtual void Eat() Console.WriteLine(Eat something); 这样,Animal 类的任何派生类都可以实现新的 Eat() 方法。,override 关键字,如果在派生类中要重写基类方法,那么需要使用 override 关键字,如下所示: public class Cat :

6、Animal public override void Eat() Console.WriteLine(Eat small animals); ,调用虚方法,通过使用多态性,可以采用一种通用的方式来处理派生类。为此,可以认为派生类对象的类型是基类类型。 当在程序中调用某个虚方法时,运行时可以判定应该具体调用哪个方法。事实上,系统将调用最底层的派生方法。如果原始虚方法没有被重写,那么最底层的派生方法就是原始虚方法,否则,最底层的派生方法就是相应对象中的重写方法。,示例代码,在派生类中使用基类成员,当需要扩展基类方法的功能时,在派生类中调用基类方法是一个很好的选择。除了可以在派生类的重写方法中添加

7、额外的功能之外,通过在重写方法中调用基类方法,可以重用基类方法的代码。,抽象方法和抽象类,6.2.2 抽象方法和 抽象类,当创建一个类时,有时需要让该类包含一些特殊的方法,该类对这些方法不提供实现,但是该类的派生类必须实现这些方法,这些方法称为抽象方法。,抽象方法和抽象类,6.2.2 抽象方法和抽象类,语法 优点 重写 具有虚方法的抽象类 抽象属性,语法,创建抽象方法的语法是以访问修饰符开始,后面跟着 abstract 修饰符、方法类型、方法名以及方法参数,声明语句以分号而不是语句块结束,如下所示: access-modifiers abstract return-type method-na

8、me (parameters) ;,优点,抽象方法的优点在于基类无需对抽象方法提供实现,但是基类的派生类必须为基类中的抽象方法提供实现。,重写,当派生类从抽象类中继承一个抽象方法时,派生类必须重写该抽象方法。这个规则在编译时强制实施。,具有虚方法的抽象类,如果有一个通用方法,该方法对所有派生类来说是公共的,并且强制要求所有派生类都必须实现这个方法,那么必须把该方法定义为基类中的抽象方法。,抽象属性,在声明抽象属性时,需要指定属性名和派生属性应该实现的访问函数。下面的代码创建了一个 Animal 类,并且声明了一个名为 PhylogenicGroup 的抽象属性。其中 Group 是一个有关动物

9、种类的枚举: public abstract class Animal public abstract Group PhylogenicGroupget; set; 若要把该属性声明为只读属性或只写属性,可以移除相应的访问函数。,继承性 多态性 接口 小结 实验 习题,第6章 面向对象的高级应用,接口,6.3 接口,什么是接口 接口的使用方法 如何使用实现了某接口的对象 如何继承多个接口 接口与抽象类的比较,什么是接口,6.3.1 什么是接口,定义 设计注意事项 接口不变性 目标,定义,设计注意事项,一个设计良好的接口可以包含一个紧密相关的功能集合,这些功能定义了一个特定行为。当一个对象实现了

10、这个接口时,该对象就实现了这个行为。 可以为接口开发新的增强实现,而不破坏现有的代码,因此接口的兼容性很强。也可以通过开发新的接口或接口的新实现来增强功能。,接口不变性,尽管可以修改接口的实现,但是接口本身在发布后就不能更改了。这一特性称为接口不变性。更改已发布的接口有可能破坏现有代码。若需要增强接口的功能,则必须创建新接口。,目标,在某些场合中,程序需要许多彼此无关的对象类型来提供特定功能,此时更适合使用接口象 接口可以在基类不同的类之间实现多态性,有时可能需要使用接口继承而不是类继承,原因如下:,目标 (续),接口比基类更加灵活,因为可以定义实现多个接口的单个实现 若不需要从基类继承实现,

11、则接口是更好的选择 若不能使用类继承,则可以使用接口,有时可能需要使用接口继承而不是类继承,原因如下:,接口的使用方法,6.3.2 接口的使用方法,声明接口 实现接口,声明接口,声明接口要使用 interface 关键字,语法如下: attributes access-modifiers interface interface-name :base-list interface-body,实现接口,要实现一个接口,必须要有类继承该接口。 接口的实现类可以是派生类,并且这些派生类可以包括一些自己特有的类成员。,示例代码,在确定对象实现了某个特定接口之后,就可以引用该接口。为了引用某接口,可以把对

12、象类型强制转换为接口类型 。 is 和 as 操作符也适用于其他类型。在运行时,可以用它们来确定类的类型。,如何使用实现了某接口的对象,6.3.3 如何使用实现了 某接口的对象,继承多个接口 继承接口的接口 显式接口实现,如何继承多个接口,6.3.4 如何继承多个接口,继承多个接口,若要实现多接口继承,则需要列出这些接口,这些接口之间用逗号分开,如下所示: class Chimpanzee: Animal, ICarnivore, IHerbivore ,继承接口的接口,接口可以继承一个或多个其他接口(这一点与类不一样)。为了继承多个其他接口,需要在接口名后书写冒号,然后书写用逗号隔开的父接口

13、列表。接口将继承它所有父接口的所有成员,并且接口用户必须实现所有被继承接口的所有成员。,显式接口实现,不允许使用访问修饰符来实现显式接口。因此,为了访问这些成员,必须把相关对象转换为相应的接口类型,如下所示: Chimpanzee chimp = new Chimpanzee(); IHerbivore vchimp = (IHerbivore) chimp; bool hungry = vchimp.IsHungry;,示例代码,接口与抽象类的比较,6.3.5 接口与抽象类的比较,与抽象类不同的是,接口是一个完全抽象的成员集,这个成员集为相关操作定义了一组规则。接口的实现完全留给了开发者。,

14、抽象类为管理组件版本提供了一种简单易行的方法。通过更新基类,所有派生类都将自动进行相应更新。而接口在创建后就不能再更改。如果需要修改接口,则必须创建新接口。,接口与抽象类的比较,6.3.5 接口与抽象类的比较,当准备为组件提供多态性时,表 54 中的建议将有助于在抽象类和接口之间做出正确的选择。,继承性 多态性 接口 小结 实验 习题,第6章 面向对象的高级应用,6.4 小结,本章继续上一章面向对象的内容更进一步阐述了面向对象的重要概念继承和多态性。 面向对象的继承原则允许创建一个基类,然后从这个基类派生出更多的派生类,其中派生类能够继承基类的属性和方法。,小结,继承性 多态性 接口 小结 实

15、验 习题,第6章 面向对象的高级应用,实验,6.5 实验,参照实验手册,并在教师指导下完成实验报告。,继承性 多态性 接口 小结 实验 习题,第6章 面向对象的高级应用,习题,6.6习题,1.填空题 (1)将一个基类对象当做_对象可能引发错误。 (2)如果一个类包含一个或多个抽象方法,它是一个_类。 (3)使用关键字_声明的类不能被继承。 (4)使用关键字_声明抽象类。 (5)多态性包括使用基类的引用来操纵一个_对象。,习题(续),6.6习题,2.判断正误,如果错误,请说明原因。 (1)抽象类中所有的方法必须被声明为abstract。 (2)具有抽象方法的类必须声明为abstract。 (3)多态性允许程序员使用基类的引用管理派生类。 (4)声明为abstract类的方法必须同时进行声明和实现。,习题(续),6.6习题,3.程序改错 阅读下面的程序,找出其中错误并改正过来:u

温馨提示

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

评论

0/150

提交评论