第7章 继承和接口设计精选PPT.ppt
《第7章 继承和接口设计精选PPT.ppt》由会员分享,可在线阅读,更多相关《第7章 继承和接口设计精选PPT.ppt(60页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、第7章 继承和接口设计第1页,本讲稿共60页7.1.1什么是继承什么是继承 一个类从另一个类派生出来时,称之为派生类或子类,被派生的一个类从另一个类派生出来时,称之为派生类或子类,被派生的类称为基类或父类。类称为基类或父类。派生类从基类那里继承特性,派生类也可以作为其他类的基类,派生类从基类那里继承特性,派生类也可以作为其他类的基类,从一个基类派生出来的多层类形成了类的层次结构。从一个基类派生出来的多层类形成了类的层次结构。7.1 继继 承承第2页,本讲稿共60页 C#中只允许中只允许单继承单继承,即一个派生类只能有一个基类。,即一个派生类只能有一个基类。C#中继承是中继承是可传递可传递的,如
2、果的,如果C从从B派生,派生,B从从A派生,那么派生,那么C不仅继承不仅继承B的成员,的成员,还继承还继承A的成员。的成员。C#中派生类中派生类可添加新成员可添加新成员,但不能删除基类的成员。,但不能删除基类的成员。C#中派生类中派生类不能继承基类的构造函数和析构函数不能继承基类的构造函数和析构函数,但能继承基类的属性。,但能继承基类的属性。C#中派生类中派生类可隐藏基类的同名成员可隐藏基类的同名成员,如果在派生类可以隐藏了基类的同名成员,基,如果在派生类可以隐藏了基类的同名成员,基类该成员在派生类中就不能被直接访问,只能通过类该成员在派生类中就不能被直接访问,只能通过“base.基类方法名基
3、类方法名”来访问。来访问。C#中派生类对象也是基类的对象,但基类对象却不一定是基派生类的对象。也就是中派生类对象也是基类的对象,但基类对象却不一定是基派生类的对象。也就是说,基类的引用变量可以引用基派生类对象,而派生类的引用变量不可以引用基类对说,基类的引用变量可以引用基派生类对象,而派生类的引用变量不可以引用基类对象。象。C#C#中的继承具有以下特点:中的继承具有以下特点:第3页,本讲稿共60页7.1.2 派生类的声明派生类的声明 派生类的声明格式如下:派生类的声明格式如下:类修饰符类修饰符 class 派生类:基类派生类:基类;C#中派生类可以从它的基类中继承字段、属性、方法、事件、中派生
4、类可以从它的基类中继承字段、属性、方法、事件、索引器等。索引器等。实际上除了构造函数和析构函数,派生类隐式地继承了基实际上除了构造函数和析构函数,派生类隐式地继承了基类的所有成员。类的所有成员。第4页,本讲稿共60页class A private int n;/私有字段私有字段 protected int m;/保护的字段保护的字段 public void afun()/公有方法公有方法 /方法的代码方法的代码 class B:A private int x;/私有字段私有字段 public void bfun()/公有方法公有方法 /方法的代码方法的代码 从中看出从中看出Base_fun()
5、方法在方法在B类类中不用重写,因为中不用重写,因为B类继承了类继承了A类,所以可以不用重写类,所以可以不用重写A类中类中的的Base_fun()方法,就可以被方法,就可以被B类调用。类调用。在主函数中包含以下代码:在主函数中包含以下代码:B b=new B();/定义对象并实例化定义对象并实例化 b.afun();第5页,本讲稿共60页7.1.3基类成员的可访问性基类成员的可访问性 派生类将获取基类的所有非私有数据和行为。派生类将获取基类的所有非私有数据和行为。如果希望在派生类中隐藏某些基类的成员,可以在基类中将这些成员如果希望在派生类中隐藏某些基类的成员,可以在基类中将这些成员设为设为pri
6、vate访问成员。访问成员。第6页,本讲稿共60页7.1.4 按次序调用构造函数和析构函数按次序调用构造函数和析构函数1.调用默认构造函数的次序调用默认构造函数的次序 如果类是从一个基类派生出来的,那么在调用这个派生类的如果类是从一个基类派生出来的,那么在调用这个派生类的默认构造函数之前会调用基类的默认构造函数。调用的次序将从默认构造函数之前会调用基类的默认构造函数。调用的次序将从最远的基类开始。最远的基类开始。第7页,本讲稿共60页class A/基类基类 public A()Console.WriteLine(调用类调用类A的构造函数的构造函数);class B:A/从从A派生类派生类B
7、public B()Console.WriteLine(调用类调用类B的构造函数的构造函数);class C:B/从从B派生类派生类C public C()Console.WriteLine(调用类调用类C的构造函数的构造函数);在主函数中执行以下语句:在主函数中执行以下语句:C b=new C();/定义对象并实例化定义对象并实例化运行结果如下:运行结果如下:调用类调用类A的构造函数的构造函数调用类调用类B的构造函数的构造函数调用类调用类C的构造函数的构造函数第8页,本讲稿共60页2.调用默认析构函数的次序调用默认析构函数的次序 当销毁对象时,它会按照相反的顺序来调用析构函数。首先调用当销毁
8、对象时,它会按照相反的顺序来调用析构函数。首先调用派生类的析构函数,然后是最近基类的析构函数,最后才调用那个派生类的析构函数,然后是最近基类的析构函数,最后才调用那个最远的析构函数。最远的析构函数。第9页,本讲稿共60页class A/基类基类 A()Console.WriteLine(调用类调用类A的析构函数的析构函数);class B:A/从从A派生类派生类B B()Console.WriteLine(调用类调用类B的析构函数的析构函数);class C:B/从从B派生类派生类C C()Console.WriteLine(调用类调用类C的析构函数的析构函数);在主函数中执行语句在主函数中执
9、行语句C b=new C();其运行结果如下:其运行结果如下:调用类调用类C的析构函数的析构函数调用类调用类B的析构函数的析构函数调用类调用类A的析构函数的析构函数第10页,本讲稿共60页3.调用重载构造函数的次序调用重载构造函数的次序 调用基类的重载构造函数需使用调用基类的重载构造函数需使用base关键字。关键字。base关键字主要是为派关键字主要是为派生类调用基类成员提供一个简写的方法,可以在子类中使用生类调用基类成员提供一个简写的方法,可以在子类中使用base关键字关键字访问的基类成员。调用基类中重载构造函数的方法是将派生类的重载构访问的基类成员。调用基类中重载构造函数的方法是将派生类的
10、重载构造函数作如下设计:造函数作如下设计:public 派生类名派生类名(参数列表参数列表1):base(参数列表参数列表2)其中,其中,“参数列表参数列表2”和和“参数列表参数列表1”存在对应关系。存在对应关系。同样,在通过同样,在通过“参数列表参数列表1”创建派生类的实例对象时,先创建派生类的实例对象时,先以以“参数列表参数列表2”调用基类的构造函数,再调用派生类的构造调用基类的构造函数,再调用派生类的构造函数。函数。第11页,本讲稿共60页【例【例7.1】分析以下程序的运行结果。分析以下程序的运行结果。using System;namespace Proj7_1class A priva
11、te int x;publicA()Console.WriteLine(调用类调用类A的构造函数的构造函数);public A(int x1)x=x1;Console.WriteLine(调用类调用类A的重载构造函数的重载构造函数);A()Console.WriteLine(A:x=0,x);class B:A private int y;publicB()Console.WriteLine(调用类调用类B的构造函数的构造函数);public B(int x1,int y1):base(x1)y=y1;Console.WriteLine(调用类调用类B的重载构造函数的重载构造函数);B()Co
12、nsole.WriteLine(B:y=0,y);第12页,本讲稿共60页 class C:B private int z;publicC()Console.WriteLine(调用类调用类C的构造函数的构造函数);public C(int x1,int y1,int z1):base(x1,y1)z=z1;Console.WriteLine(调用类调用类C的重载构造函数的重载构造函数);C()Console.WriteLine(C:z=0,z);class Program static void Main(string args)C c=new C(1,2,3);第13页,本讲稿共60页7.
13、1.5 使用使用sealed修饰符来禁止继承修饰符来禁止继承 C#中提供了中提供了sealed关键字用来禁止继承。要禁止继承一个类,只关键字用来禁止继承。要禁止继承一个类,只需要在声明类时加上需要在声明类时加上sealed关键字就可以了,这样的类称为密封类。关键字就可以了,这样的类称为密封类。例如:例如:sealed class 类名类名 这样就不能从该类派生任何子类。这样就不能从该类派生任何子类。第14页,本讲稿共60页7.2.1 什么是多态性什么是多态性 面向对象程序设计中的多态性是一个重要的概念。所谓多态面向对象程序设计中的多态性是一个重要的概念。所谓多态性,就是性,就是同一签名具有不同
14、的表现行为同一签名具有不同的表现行为,运算符重载和函数,运算符重载和函数重载都属于多态性的表现形式。重载都属于多态性的表现形式。7.2 多态性多态性第15页,本讲稿共60页7.2.2 隐藏基类方法隐藏基类方法当派生类从基类继承时,它会获得基类的所有方法、字当派生类从基类继承时,它会获得基类的所有方法、字段、属性和事件。若要更改基类的数据和行为,有两种选择:段、属性和事件。若要更改基类的数据和行为,有两种选择:方法方法1:使用新的派生成员替换基成员:使用新的派生成员替换基成员方法方法2:重写虚拟的基成员。:重写虚拟的基成员。第16页,本讲稿共60页方法方法1示例:在使用新的派生方法替换基方法时应
15、使用示例:在使用新的派生方法替换基方法时应使用new关键关键字。例如:字。例如:class A public void fun()Console.WriteLine(A);class B:A new public void fun()/隐藏基类方法隐藏基类方法fun Console.WriteLine(B);在主函数中执行以下语句:在主函数中执行以下语句:B b=new B();b.fun();运行结果如下:运行结果如下:B第17页,本讲稿共60页7.2.3 重写重写重写是指在子类中编写有相同名称和参数的方法。重写是指在子类中编写有相同名称和参数的方法。重写和重载的区别:重写和重载的区别:后者
16、是指编写(在同一个类中)具有相同后者是指编写(在同一个类中)具有相同的名称,却有不同的参数的方法。也就是说,重写是指子类中的方的名称,却有不同的参数的方法。也就是说,重写是指子类中的方法与基类中的方法具有相同的签名,而重载方法具有不同的签名。法与基类中的方法具有相同的签名,而重载方法具有不同的签名。第18页,本讲稿共60页1.virtual关键字关键字 virtual关键字用于修饰方法、属性、索引器或事件声明,并且关键字用于修饰方法、属性、索引器或事件声明,并且允许在派生类中重写这些对象。例如,以下定义了一个虚拟方法允许在派生类中重写这些对象。例如,以下定义了一个虚拟方法并可被任何继承它的类重
17、写:并可被任何继承它的类重写:public virtual double Area()return x*y;调用虚方法时,首先调用派生类中的该重写成员,如果没调用虚方法时,首先调用派生类中的该重写成员,如果没有派生类重写该成员,则它可能是原始成员。有派生类重写该成员,则它可能是原始成员。注意:默认情况下,方法是非虚拟的,不能重写非虚方法。注意:默认情况下,方法是非虚拟的,不能重写非虚方法。virtual修饰符不能与修饰符不能与static、abstract和和override修饰符一起使用。修饰符一起使用。在静态属性上使用在静态属性上使用virtual修饰符是错误的。修饰符是错误的。第19页,
18、本讲稿共60页2.重写方法重写方法 override方法提供从基类继承的成员的新实现。通过方法提供从基类继承的成员的新实现。通过override声明声明重写的方法称为重写基方法。重写的基方法必须与重写的方法称为重写基方法。重写的基方法必须与override方法具有方法具有相同的签名。相同的签名。注意:不能重写非虚方法或静态方法。重写的基方法必须是注意:不能重写非虚方法或静态方法。重写的基方法必须是virtual、abstract或或override的。的。第20页,本讲稿共60页【例【例7.2】分析以下程序的运行结果。分析以下程序的运行结果。using System;namespace Pro
19、j7_2class Student protected int no;/学号学号 protected string name;/姓名姓名 protected string tname;/班主任或指导教师班主任或指导教师 public void setdata(int no1,string name1,string tname1)no=no1;name=name1;tname=tname1;public virtual void dispdata()/虚方法虚方法 Console.WriteLine(本科生学号本科生学号:0 姓名姓名:1 班班 主主 任任:2,no,name,tname);第2
20、1页,本讲稿共60页 class Graduate:Student public override void dispdata()/重写方法重写方法 Console.WriteLine(研究生研究生 学号学号:0 姓名姓名:1 指导教师指导教师:2,no,name,tname);class Program static void Main(string args)Student s=new Student();s.setdata(101,王华王华,李量李量);s.dispdata();Graduate g=new Graduate();g.setdata(201,张华张华,陈军陈军);g.di
21、spdata();第22页,本讲稿共60页【例【例7.3】设计一个控制台应用程序,采用虚方法求长方形、圆、圆球体设计一个控制台应用程序,采用虚方法求长方形、圆、圆球体和圆柱体的面积或表面积。和圆柱体的面积或表面积。using System;namespace Proj7_3 public class Rectangle /长方形类长方形类 public const double PI=Math.PI;protected double x,y;public Rectangle()public Rectangle(double x1,double y1)x=x1;y=y1;public virtu
22、al double Area()/求面积求面积 return x*y;第23页,本讲稿共60页 public class Circle:Rectangle /圆类圆类 public Circle(double r):base(r,0)public override double Area()/求面积求面积 return PI*x*x;class Sphere:Rectangle /圆球体类圆球体类 public Sphere(double r):base(r,0)public override double Area()/求面积求面积 return 4*PI*x*x;class Cylinde
23、r:Rectangle /圆柱体类圆柱体类 public Cylinder(double r,double h):base(r,h)public override double Area()/求面积求面积 return 2*PI*x*x+2*PI*x*y;第24页,本讲稿共60页 class Program static void Main(string args)double x=2.4,y=5.6;double r=3.0,h=5.0;Rectangle t=new Rectangle(x,y);Rectangle c=new Circle(r);Rectangle s=new Spher
24、e(r);Rectangle l=new Cylinder(r,h);Console.WriteLine(长为长为0,宽为宽为1的长方形面积的长方形面积=2:F2,x,y,t.Area();Console.WriteLine(半径为半径为0的圆面积的圆面积=1:F2,r,c.Area();Console.WriteLine(半径为半径为0的圆球体表面积的圆球体表面积=1:F2,r,s.Area();Console.WriteLine(半径为半径为0,高度为高度为1的圆柱体表面积的圆柱体表面积=2:F2,r,h,l.Area();第25页,本讲稿共60页7.3 抽象类抽象类7.3.1 什么是抽象
25、类什么是抽象类 在类声明中使用在类声明中使用abstract修饰符的类称为抽象类。抽象类具有修饰符的类称为抽象类。抽象类具有以下特点:以下特点:抽象类不能实例化。抽象类不能实例化。抽象类可以包含抽象方法和抽象访问器。抽象类可以包含抽象方法和抽象访问器。抽象类中可以存在非抽象的方法。抽象类中可以存在非抽象的方法。不能用不能用sealed修饰符修改抽象类,这也意味着抽象类不能被继承。修饰符修改抽象类,这也意味着抽象类不能被继承。从抽象类派生的非抽象类必须包括继承的所有抽象方法和抽从抽象类派生的非抽象类必须包括继承的所有抽象方法和抽象访问器的实现。象访问器的实现。抽象类可以被抽象类所继承,结果仍是抽
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 第7章 继承和接口设计精选PPT 继承 接口 设计 精选 PPT
限制150内