《Visual C#程序设计教程 教学课件 ppt 作者 刘先省 陈克坚第8章 继承》由会员分享,可在线阅读,更多相关《Visual C#程序设计教程 教学课件 ppt 作者 刘先省 陈克坚第8章 继承(21页珍藏版)》请在金锄头文库上搜索。
1、第1章 程序设计语言与程序设计方法 第2章 Visual C#概述 第3章 C#语法基础 第4章 顺序结构程序设计 第5章 选择结构程序设计 第6章 循环结构程序设计 第7章 面向对象编程技术 第8章 继承,第9章 数组与自定义类型 第10章 菜单、工具栏与状态栏 第11章 文件操作 第12章 数据库技术 第13章 ActiveX控件 第14章 异常处理与跟踪调试 第15章 开发Web应用程序 第16章 部署应用程序,下一页,Visual C#程序设计教程,上一页,章节目录,上一页,下一页,第8章 继 承 8.1 类的继承性 类的继承性是指一个类定义既可以具有其他类的数据成员、属性成员、方法成
2、员等,也可以使其他类具有自己的数据成员、属性成员、方法成员等。 在类的继承中,被继承的类叫基类或父类,继承的类叫派生类或子类。,章节目录,上一页,下一页,8.1.1 类的继承 当一个类从另一个类派生出来时,派生类就自然具有了基类数据成员、属性成员和方法成员等,基类定义中这些成员的代码,已不需要在派生类定义中重写,在派生类的定义中,只需书写基类定义中所不具有的代码即可。这样,既提高了代码的重用性,从而提高程序设计的效率;又为程序设计中的特别需要提供了编写代码的自由空间,从而提供了已有程序设计成果的可扩展性。,章节目录,上一页,下一页,在C#中,类的继承遵循以下规则: 派生类只能继承于一个基类。
3、派生类自然继承基类的成员,但不能继承基类的构造函数成员。 类的继承可以传递。例如,假设C类继承B类,B类又继承A类,那么C类即具有了B类与A类的成员。在C#中,Object类是所有类的基类,也就是说所有的类都具有Object类的成员。 派生类是对基类的扩展,派生类定义中可以声明新的成员,但不能消除已继承的基类成员。 基类中的成员声明时,不管其是什么访问控制方式,总能被派生类继承,访问控制的不同只决定派生类成员是否能够访问基类成员。 派生类定义中如果声明了与基类同名的成员,则基类的同名成员将被覆盖,从而使派生类不能直接访问同名的基类的成员。 基类可以定义虚方法成员等,这样派生类能够重载这些成员以
4、表现类的多态性。,章节目录,上一页,下一页,8.1.2 定义派生类 1. 派生类定义格式 派生类通常定义的语法格式为: pulbic class 派生类名称 : 基类名称类体 public:访问控制修饰符,访问控制修饰符可以是public、protected和private。通常都使用public以保证类的开放性,并且public可以省略,因为类定义的访问控制默认为是pulbic。 “:基类名称”:表示所继承的类。,章节目录,上一页,下一页,基类定义如下: public class Student public string id; public string name; public str
5、ing sex; public byte age; public string Show( ) return “学号:“+id+“ 姓名:“+name+“n性别:“+sex+“ 年龄:“+age; ,章节目录,上一页,下一页,派生类定义如下: public class Student_1: Student public byte score1,score2; public uint Total() return (uint)score1+(uint)score2; public float Average() return (float)(score1+score2)/2; ,章节目录,上一页
6、,下一页,2. protected访问修饰符的作用 根据面向对象程序设计封装性要求,类中的数据成员通常是不允许直接访问的,因此数据成员一般不使用public修饰符,而使用protected或private修饰符,使对数据成员的访问必须通过public的属性或方法实现。在类的继承中,作为基类的数据成员通常使用protected修饰符,而不使用private修饰符。因为如果在基类中使用private修饰符声明数据成员,则其成员将不允许派生类成员访问,而protected修饰符,既能保证数据成员不被直接访问,又允许其派生类成员访问。,章节目录,上一页,下一页,3. 创建派生类对象 基类与派生类定义完
7、成后,用派生类声明的对象,将包含基类的成员(除了构造函数),因此,派生类对象可以直接访问基类成员。例如: Student_1 subS=new Student_1( ); / 设置派生类继承的基类数据成员值 subS.SetStudent(“2005001”,“张三”,“女”,21); / 设置派生类自身数据成员值 subS.SetStudent_1(90,100); subS.Show( ); / 调用派生类继承的基类方法,章节目录,上一页,下一页,4. 构造函数的调用 在创建派生类对象时,调用构造函数的顺序是先调用基类构造函数,再调用派生类的构造函数,以完成为数据成员分配内存空间并进行初始
8、化的工作。 如果派生类的基类本身是另一个类的派生类,则构造函数的调用次序按由高到低顺序依次调用。例如,假设A类是B类的基类,B类是C类的基类,则创建C类对象时,调用构造函数的顺序为,先调用A类的构造函数,再调用B类的构造函数,最后调用C类的构造函数。,章节目录,上一页,下一页,5. 向基类构造函数传递参数 向基类构造函数传递参数,必须通过派生类的构造函数实现,其格式如下: public 派生类构造函数名(形参列表):base(向基类构造函数传递的实参列表) “base”是C#关键字,表示调用基类的有参构造函数。 传递给基类构造函数的“实参列表”通常包含在派生类构造函数的“形参列表”中。,章节目
9、录,上一页,下一页,8.1.3 密封类 C#中有一种类叫密封类,密封类是不允许其他类继承的类。 Convert类就是一个密封类。 定义密封类需要使用sealed关键字,其格式为: 访问修饰符 sealed class 类名称 例如: public sealed class SealedClass public string method( ) return “我是密封类“; ,章节目录,上一页,下一页,C#还允许将一个非密封类定义中的某个方法声明为密封方法。一旦方法被声明为密封方法,将不允许在派生类中重载该方法。关于派生类中重载基类方法,将在下节多态性中介绍。例如: public class
10、SealedMethod public sealed string SMethod( ) return “我是一个密封方法“; ,章节目录,上一页,下一页,8.2 多态性 8.2.1 多态性概述 在类的继承中,C#允许在基类与派生类中声明具有同名的方法,而且同名的方法可以有不同的代码,也就是说在基类与派生类的相同功能中可以有不同的具体实现,从而为解决同一问题提供多种途径。 多态性就是指在程序运行时,执行的虽然是一个调用方法的语句,却可以根据派生类对象的类型不同完成方法的不同的具体实现。 在C#中可以通过多种途径实现多态性。,章节目录,上一页,下一页,8.2.2 虚方法 1. 声明与基类同名的派
11、生类方法 在派生类中用new关键字声明与基类同名的方法的格式如下: public new 方法名称(参数列表) 2. 声明虚方法 基类中的声明格式: public virtual 方法名称(参数列表) 派生类中的声明格式: public override 方法名称(参数列表) ,章节目录,上一页,下一页,要实现多态性,通常是在基类与派生类定义之外再定义一个含基类对象形参的方法 。多态性的关键就在该方法中的形参对象在程序运行前根本就不知道是什么类型的对象,要一直到程序运行时,该方法被调用,接受了对象参数,才会知道是什么类型的对象。因为基类对象不仅可以接受本类型的对象实参,也可以接受其派生类类型或
12、派生类的派生类类型的实参,并且可以根据接受的对象类型不同调用相应类定义中的方法,从而实现多态性。,章节目录,上一页,下一页,3. 调用基类方法 在派生类中声明与基类同名的方法,也叫方法重载。在派生类重载基类方法后,如果想调用基类的同名方法,可以使用base关键字。例如,假定基类与派生类都有一个无参数Show方法。则在派生类中调用基类Show方法的代码为: base Show( ); / 调用基类Show方法,章节目录,上一页,下一页,8.2.3 抽象类与抽象方法 为了实现多态,必须在基类中声明虚方法,但有时基类中声明的虚方法无法实现具体的功能。这时需要在基类中声明抽象方法 抽象类是指基类的定义
13、中声明不包含任何实现代码的方法,实际上就是一个不具有任何具体功能的方法。这样的方法唯一的作用就是让派生类重写。 在基类定义中,只要类体中包含一个抽象方法,该类即为抽象类。在抽象类中也可以声明一般的虚方法。,章节目录,上一页,下一页,1. 声明抽象类与抽象方法 声明抽象类与抽象方法均需使用关键字abstract,其格式为: public abstract class 类名称 public abstract 返回类型 方法名称(参数列表); 抽象方法不是一般的空方法,抽象方法声明时,没有方法体,只有方法头后跟一个分号。,章节目录,上一页,下一页,2. 重载抽象方法 当定义抽象类的派生类时,派生类自然从抽象类继承抽象方法成员,并且必须重写(重载)抽象类的抽象方法,这是抽象方法与虚方法的不同,因为对于基类的虚方法,其派生类可以不必重写(重载)。重载抽象类方法必须使用override关键字。 重载抽象方法的格式为: pulbic override 返回类型 方法名称(参数列表) . 其中,方法名称与参数列表必须与抽象类中的抽象方法完全一致。,章节目录,上一页,下一页,