资源描述
单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,*,*,第,5,章面向对象程序设计进阶,5.1,继承,5.1.1,继承概述,5.1.1,继承概述,从面向对象程序设计的观点来看,继承表示类之间存在一种一般与特殊的关系,这种关系使得某类对象可以继承另外一类对象的特征。,表示一般的类称为基类或超类,表示特殊的类称为派生类或子类。派生类继承了基类的所有特征,同时又可以加入自己的特征。,继承是面向对象程序设计的基本特征之一,它允许派生类继承基类的数据成员和成员函数。同时,派生类又可以添加新的成员或者对基类已有成员进行重定义,继承体现了代码重用思想。,5.1.2,定义派生类,定义派生类的格式:,类修饰符,class,类名:基类,类体,在类定义中,通过在类名的后面加上冒号和基类名表示继承。其它内容与定义类一样。,【,例,5-1】,定义派生类,Student P104,5.1.3,派生类的构造函数,在,C#,中,构造函数不能被继承。因此,在派生类中必须定义派生类的构造函数。,派生类构造函数的一般格式:,派生类构造函数名,(,派生类参数列表,):base(,基类参数列表,),初始化语句,当生成派生类对象时,构造函数的执行顺序为:首先执行基类构造函数,然后再执行派生类的构造函数。,【,例,5-2】,派生类构造函数的执行顺序,P106,5.1.4,访问和隐藏基类成员,1.,访问基类成员,在派生类中使用,base,关键字访问基类成员。,base.Speak,(),2.,成员隐藏,在派生类中,通过定义与基类同名的新成员可以隐藏基类的成员,从而达到修改基类成员的目的。必须在派生类成员的声明中加上,new,修饰符,否则编译器在编译时会发出警告信息。,【,例,5-3】,访问和隐藏基类成员,P108,5.1.5,禁止继承,C#,提供一种不能被继承的类,称为密封类。如果想定义密封类,只需要在定义类时,使用,sealed,修饰符就可以了。,【,例,5-4】,使用密封类,P110,5.1.6,使用扩展,使用扩展方法可以向现有类中添加新的方法,而无需创建新的派生类或以其他方式修改原始类。扩展方法是在静态类中定义的特殊静态方法,但它可以像扩展类中的实例方法一样被调用。,定义扩展方法的格式:,public static,返回值类型 扩展方法名,(this,要扩展的类,扩展方法的参数列表,),在,this,关键字的后边指定要扩展的类;如果扩展方法带有参数的话,应该在扩展类的后边给出参数列表。,调用扩展方法必须遵循以下步骤:,使用,using,指令导入定义扩展方法的静态类所在的命名空间;,像调用类的实例方法一样调用扩展方法。,【,例,5-5】,为,int,类型添加扩展方法,P111,5.2,抽象类与接口,5.2.1,抽象类,抽象类表示一种抽象的概念,用来为派生类提供一个公共接口。,抽象类只能作为其它类的基类,不能实例化。抽象类所定义的接口,必须由派生类具体实现。,抽象类可以包含抽象方法和抽象属性,也可以包含实例字段和实例方法。,1.,定义抽象类,使用,abstract,修饰符定义类即可定义抽象类。,5.2.1,抽象类,2.,抽象方法,抽象方法是一个只有方法签名,而没有方法体的特殊方法。抽象方法的声明格式:,访问修饰符,abstract,返回值类型 方法名,(,参数列表,);,在派生类中,必须实现抽象方法。格式:,访问修饰符,override,返回值类型 方法名,(,参数列表,),方法体,5.2.1,抽象类,3.,抽象属性,抽象属性的声明格式:,访问修饰符,abstract,返回值类型 属性名,get;set;,在派生类中,必须实现抽象属性。具体格式:,访问修饰符,override,返回值类型 属性名,get get,访问器代码块,set set,访问器代码块,【,例,5-6】,使用抽象类,P113,5.2.2,接口,1.,接口声明,接口声明是一种类型声明,它定义一个新的接口类型。接口声明格式:,接口修饰符,interface,接口名,:,基接口,接口体,接口可以包含方法、属性、索引和事件。,接口可以从零或多个接口继承,被继承的接口称为该接口的显式基接口,public interface,IShape,double,GetArea,();,string Type get;,5.2.2,接口,2.,接口实现,由于接口不提供实现,所以必须使用类和结构来实现。,【,例,5-7】,实现,IShape,接口,P115,5.3,多态,5.3.1,多态概述,多态性是指不同对象收到相同消息时,会产生不同动作。从而实现“一个接口,多种方法”。比如,向,MP3,发送“播放”消息,它会播放音乐,而向,DVD,发送“播放”消息,它会播放电影。,C#,支持两种多态性,:,编译时多态性(静态多态性)在程序编译时就决定如何实现某一动作,它是通过重载实现的。编译时多态性在编译时就知道调用方法的全部信息。,运行时多态性(动态多态性)是在程序运行时动态实现某一动作,它是通过继承和虚方法实现的。,5.3.2,虚方法与重载方法,在定义时加上,virtual,修饰符,则该方法就是虚方法。,在派生类中重载虚方法时,要为重载方法加上,override,修饰符。,重载虚方法要求派生类的重载方法的方法名称、方法参数类型、方法参数数量、方法参数顺序和方法返回值类型都必须与基类中的虚方法完全一样。,在派生类中重载虚方法,将重写从基类继承来的具有相同名称的虚方法,从而使该方法专用于派生类,为派生类做具体的工作。,【,例,5-8】,重载虚方法和重写非虚方法,P117,5.3.3,运算符重载,运算符重载的基本格式:,public static,返回值类型,operator,运算符,(,参数列表,),operator,关键字用来重载运算符,,public,和,static,修饰符为必选项。,public static,int,operator+(Prime data1,Prime data2),【,例,5-9】,重载加法运算符,P119,5.3.4,实现多态,在,C#,中,可以通过继承、抽象类和接口实现多态性。,使用继承实现多态性时,应该在基类中定义虚方法,然后在派生类中重载虚方法。,使用抽象类实现多态性时,应该在抽象类中定义抽象方法,然后在派生类中实现抽象方法。此时的抽象方法与虚方法类似。,使用接口实现多态性时,应该在接口中定义方法,然后在派生类中实现在接口中定义的方法。,【,例,5-10】,计算圆和圆内接正方形的面积和周长,P120,5.4,综合案例,细化毕业设计管理系统的实体类,在毕业设计管理系统中,有三类人员,即教师、管理人员和学生。,在上一个案例中,三类人员都用,Person,类实现。本案例对,Person,类再进一步细化,将,Person,类定义为抽象类,然后从,Person,类派生出,Teacher,类、,Admin,类和,Student,类,以表示教师、管理人员和学生。,
展开阅读全文