首页 第7章 继承

第7章 继承

举报
开通vip

第7章 继承nullnull第1章 Visual C#概述 第2章 C#语法基础 第3章 顺序结构程序设计 第4章 选择结构程序设计 第5章 循环结构程序设计 第6章 面向对象编程技术 第7章 继承第8章 数组与自定义类型 第9章 菜单、工具栏与状态栏 第10章 鼠标键盘事件 第11章 ActiveX控件 第12章 数据库技术 第13章 开发Web应用程序 第14章 异常处理与部署应用程序下一页Visual C# 2005程序设计上一页null 章节目录上一页下一页第7章 继 承 7.1 类的继承...

第7章 继承
nullnull第1章 Visual C#概述 第2章 C#语法基础 第3章 顺序结构程序设计 第4章 选择结构程序设计 第5章 循环结构程序设计 第6章 面向对象编程技术 第7章 继承第8章 数组与自定义类型 第9章 菜单、工具栏与状态栏 第10章 鼠标键盘事件 第11章 ActiveX控件 第12章 数据库技术 第13章 开发Web应用程序 第14章 异常处理与部署应用程序下一页Visual C# 2005程序设计上一页null 章节目录上一页下一页第7章 继 承 7.1 类的继承性 类的继承性是指一个类定义既可以具有其他类的数据成员、属性成员、 方法 快递客服问题件处理详细方法山木方法pdf计算方法pdf华与华方法下载八字理论方法下载 成员等,也可以使其他类具有自己的数据成员、属性成员、方法成员等。 在类的继承中,被继承的类叫基类或父类,继承的类叫派生类或子类。 null 章节目录上一页下一页7.1.1 类的继承 当一个类从另一个类派生出来时,派生类就自然具有了基类数据成员、属性成员和方法成员等,基类定义中这些成员的代码,已不需要在派生类定义中重写,在派生类的定义中,只需书写基类定义中所不具有的代码即可。这样,既提高了代码的重用性,从而提高程序设计的效率;又为程序设计中的特别需要提供了编写代码的自由空间,从而提供了已有程序设计成果的可扩展性。null 章节目录上一页下一页在C#中,类的继承遵循以下规则: ① 派生类只能继承于一个基类。 ② 派生类自然继承基类的成员,但不能继承基类的构造函数成员。 ③ 类的继承可以传递。例如,假设C类继承B类,B类又继承A类,那么C类即具有了B类与A类的成员。在C#中,Object类是所有类的基类,也就是说所有的类都具有Object类的成员。 ④ 派生类是对基类的扩展,派生类定义中可以声明新的成员,但不能消除已继承的基类成员。 ⑤ 基类中的成员声明时,不管其是什么访问控制方式,总能被派生类继承,访问控制的不同只决定派生类成员是否能够访问基类成员。 ⑥ 派生类定义中如果声明了与基类同名的成员,则基类的同名成员将被覆盖,从而使派生类不能直接访问同名的基类的成员。 ⑦ 基类可以定义虚方法成员等,这样派生类能够重载这些成员以表现类的多态性。 null 章节目录上一页下一页7.1.2 定义派生类 1. 派生类定义格式 派生类通常定义的语法格式为: pulbic class 派生类名称 : 基类名称{类体} public:访问控制修饰符,访问控制修饰符可以是public、protected和private。通常都使用public以保证类的开放性,并且public可以省略,因为类定义的访问控制默认为是pulbic。 “:基类名称”:表示所继承的类。 null 章节目录上一页下一页长方体类作为基类定义如下: public class Cuboid { // 声明字段 private double length; private double width; private double high; null 章节目录上一页下一页// 声明属性 public double Length { get { return length; } set { length = value; } } public double Width { get { return width; } set { width = value; } } public double High { get { return high; } set { high = value; } } // 声明计算体积的方法 public double CuboidCubage() { return length * width * high; } }null 章节目录上一页下一页派生类定义如下: public class Cube : Cuboid { public double CubeCubage() { // 注意这里使用的是基类定义中的公有成员 return Length * Length * Length; } }null 章节目录上一页下一页2. protected访问修饰符的作用 根据面向对象程序设计封装性要求,类中的数据成员通常是不允许直接访问的,因此数据成员一般不使用public修饰符,而使用protected或private修饰符,使对数据成员的访问必须通过public的属性或方法实现。在类的继承中,作为基类的数据成员通常使用protected修饰符,而不使用private修饰符。因为如果在基类中使用private修饰符声明数据成员,则其成员将不允许派生类成员访问,而protected修饰符,既能保证数据成员不被直接访问,又允许其派生类成员访问。null 章节目录上一页下一页3. 声明派生类对象 基类与派生类定义完成后,用派生类声明的对象,将包含基类的成员(除了构造函数),因此,派生类对象可以直接访问基类成员。例如: Cube cube = new Cube(); // 声明派生类对象 cube.Length = 15; // 设置派生类继承的基类数据成员值null 章节目录上一页下一页【例8-1】创建Windows应用程序,在程序中比照前述内容定义基类Cuboid与派生类Cube,创建并显示基类与派生类对象的信息。 null 章节目录上一页下一页窗体的Load事件代码为: private void Form1_Load(object sender, EventArgs e) { // 声明基类对象 Cuboid cuboid = new Cuboid(); // 设置基类对象值 cuboid.Length = 8; cuboid.Width = 5; cuboid.High = 3; null 章节目录上一页下一页 // 输出基类对象信息 label1.Text = “长方体的长宽高为:” + cuboid.Length + " " + cuboid.Width +" "+cuboid.High +“\n长方体的体积为:” +cuboid.CuboidCubage( ); Cube cube = new Cube(); // 声明派生类对象 cube.Length = 15; // 设置派生类对象值 // 输出派生类对象信息 label1.Text += “\n正方体的棱长为:” + cube.Length +“\n正方体的体积为:” +cube.CubeCubage( ); }null 章节目录上一页下一页4. 构造函数的调用 在创建派生类对象时,调用构造函数的顺序是先调用基类构造函数,再调用派生类的构造函数,以完成为数据成员分配内存空间并进行初始化的工作。 如果派生类的基类本身是另一个类的派生类,则构造函数的调用次序按由高到低顺序依次调用。例如,假设A类是B类的基类,B类是C类的基类,则创建C类对象时,调用构造函数的顺序为,先调用A类的构造函数,再调用B类的构造函数,最后调用C类的构造函数。 null 章节目录上一页下一页5. 向基类构造函数传递参数 向基类构造函数传递参数,必须通过派生类的构造函数实现,其格式如下: public 派生类构造函数名(形参列表):base(向基类构造函数传递的实参列表){ } “base”是C#关键字,表示调用基类的有参构造函数。 传递给基类构造函数的“实参列表”通常包含在派生类构造函数的“形参列表”中。 null 章节目录上一页下一页7.1.3 密封类 C#中有一种类叫密封类,密封类是不允许其他类继承的类。 Convert类就是一个密封类。 定义密封类需要使用sealed关键字,其格式为: 访问修饰符 sealed class 类名称{ } 例如: public sealed class SealedClass { public string method( ) { return "我是密封类"; } }null 章节目录上一页下一页C#还允许将一个非密封类定义中的某个方法声明为密封方法。一旦方法被声明为密封方法,将不允许在派生类中重载该方法。关于派生类中重载基类方法,将在下节《多态性》中介绍。例如: public class SealedMethod { public sealed string SMethod( ) { return "我是一个密封方法"; } }null 章节目录上一页下一页7.2 多态性 7.2.1 多态性概述 在类的继承中,C#允许在基类与派生类中声明具有同名的方法,而且同名的方法可以有不同的代码,也就是说在基类与派生类的相同功能中可以有不同的具体实现,从而为解决同一问题提供多种途径。 多态性就是指在程序运行时,执行的虽然是一个调用方法的语句,却可以根据派生类对象的类型不同完成方法的不同的具体实现。 在C#中可以通过多种途径实现多态性。null 章节目录上一页下一页7.2.2 虚方法 1. 声明与基类同名的派生类方法 在派生类中用new关键字声明与基类同名的方法的格式如下: public new 方法名称(参数列表){ } 2. 声明虚方法 基类中的声明格式: public virtual 方法名称(参数列表){ } 派生类中的声明格式: public override 方法名称(参数列表){ }null 章节目录上一页下一页 要实现多态性,通常是在基类与派生类定义之外再定义一个含基类对象形参的方法 。多态性的关键就在该方法中的形参对象在程序运行前根本就不知道是什么类型的对象,要一直到程序运行时,该方法被调用,接受了对象参数,才会知道是什么类型的对象。因为基类对象不仅可以接受本类型的对象实参,也可以接受其派生类类型或派生类的派生类类型的实参,并且可以根据接受的对象类型不同调用相应类定义中的方法,从而实现多态性。 null 章节目录上一页下一页3. 调用基类方法 在派生类中声明与基类同名的方法,也叫方法重载。在派生类重载基类方法后,如果想调用基类的同名方法,可以使用base关键字。例如,假定基类与派生类都有一个无参数Show方法。则在派生类中调用基类Show方法的代码为: base Show( ); // 调用基类Show方法 null 章节目录上一页下一页7.2.3 抽象类与抽象方法 为了实现多态,必须在基类中声明虚方法,但有时基类中声明的虚方法无法实现具体的功能。这时需要在基类中声明抽象方法 抽象类是指基类的定义中声明不包含任何实现代码的方法,实际上就是一个不具有任何具体功能的方法。这样的方法唯一的作用就是让派生类重写。 在基类定义中,只要类体中包含一个抽象方法,该类即为抽象类。在抽象类中也可以声明一般的虚方法。null 章节目录上一页下一页1. 声明抽象类与抽象方法 声明抽象类与抽象方法均需使用关键字abstract,其格式为: public abstract class 类名称 { … public abstract 返回类型 方法名称(参数列表); … } 抽象方法不是一般的空方法,抽象方法声明时,没有方法体,只有方法头后跟一个分号。null 章节目录上一页下一页2. 重载抽象方法 当定义抽象类的派生类时,派生类自然从抽象类继承抽象方法成员,并且必须重写(重载)抽象类的抽象方法,这是抽象方法与虚方法的不同,因为对于基类的虚方法,其派生类可以不必重写(重载)。重载抽象类方法必须使用override关键字。 重载抽象方法的格式为: pulbic override 返回类型 方法名称(参数列表) {... } 其中,方法名称与参数列表必须与抽象类中的抽象方法完全一致。null 章节目录上一页下一页AAA
本文档为【第7章 继承】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
该文档来自用户分享,如有侵权行为请发邮件ishare@vip.sina.com联系网站客服,我们会及时删除。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
下载需要: 免费 已有0 人下载
最新资料
资料动态
专题动态
is_994552
暂无简介~
格式:ppt
大小:108KB
软件:PowerPoint
页数:0
分类:其他高等教育
上传时间:2010-12-30
浏览量:23