第五讲-面向对象编程二继承封装和多态

上传人:dja****22 文档编号:243005353 上传时间:2024-09-13 格式:PPT 页数:22 大小:79KB
返回 下载 相关 举报
第五讲-面向对象编程二继承封装和多态_第1页
第1页 / 共22页
第五讲-面向对象编程二继承封装和多态_第2页
第2页 / 共22页
第五讲-面向对象编程二继承封装和多态_第3页
第3页 / 共22页
点击查看更多>>
资源描述
,*,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,第五讲 面向对象编程(二)继承、封装和多态,1,4.3 继承、封装和多态,4.3.1 继承,4.3.2 封装,4.3.3 多态,4.3.4 this和base关键字,2,4.3.1 类的继承,继承的意思是一个类可以建立在另一个类的基础上,可以继承另一个类的属性和方法。我们把被继承的类叫做基类,通过继承产生的类叫做派生类(也可以叫做父类和子类)。继承的概念来源与现实的生活,比如汽车、轮船、火车飞机等就是继承于交通工具这个类,而汽车类中又可以派生出新的类,比如轿车、面包车等等。,引入继承可以让我们重用以前写过的代码,新编写的代码可以在原来的基础上继承而来。,在C#中继承的方式就是定义派生类。,在C#中,所有的类都是通过直接或间接地继承Object类得到的。,3,1. 派生子类,定义派生类的基本形式:,class 派生类名字:基类名字,派生类的代码;,public class Parent, public Parent( ), .定义一个构造函数,public void WriteItem( ), .定义方法 ,public class Child:Parent, public Child( ), . 派生类的构造函数,public static void Main( ), Child a=new Child( );,a.WriteItem( ); ,派生类使用基类的方法,基类的构造函数先执行再执行派生类的构造函数。,4,2. 域的继承、添加与隐藏,1、域的继承:子类可以继承父类的所有成员。,2、域的添加:在子类定义中加上新的域变量,就可以使得子类具有比父类多的属性。如:,class Student: Person, string school;,int score; 子类比父类多了两个成员: school、score。,3、域的隐藏:子类重新定义一个从父类中继承的域变量。,class A public int a; ,class B:A ,new,public int a;,使用new修饰符来隐藏父类的同名成员a。,5,3. 方法的继承、添加与覆盖,1、方法的继承:子类可以继承父类的所有方法。,2、方法的添加:在子类定义中加上新的方法,以针对子类实现相应的功能。比如可以在Student类中定义分数的判断方法。,3、方法的覆盖:子类定义与父类同名的方法。(多态之一),(1)定义同名但参数列表不同的方法,称为方法的重载;,(2)定义同名且参数列表也相同的方法,称为新增,这时应 该在同名方法前面用new修饰符;,(3)定义同名且参数列表也相同的方法,并且父类中的方法用abstract/virtual进行修饰,子类中的方法用override进行了修饰,称为虚方法的覆盖。,6,方法重载举例,class parent, public int add( int x,int y ), return(x+y); ,class child:parent, public int add(int x,int y ,int z), return(x+y+z); ,public static void Main( ), child c1=new child( );,c1.add(1,2,3);,c1.add(4,5);,分别使用了自己和父类的方法。,7,方法隐藏举例,class parent, public int add( int x,int y ), return(x+y); ,class child:parent,new public int add(int x,int y), return(x+y+10); ,public static void Main( ), child c1=new child( );,c1.add(4,5);,使用了自己的方法。,8,虚方法覆盖举例,Class one, public void x( ),Console.WriteLine(“one_x”);,public virtual void y( ),Console.WriteLine(“one_y”); ,Class two:one, new public void x( )/隐藏父类中的同名方法,Console.WriteLine(“two_x”);,public override void y( )/重写同名方法, Console.WriteLine(“two_y”);,Class test, public static void Main( ), two m2=new m2();,one m1=m2;,/m1指向m2实例,m1.x(); m2.x();,m1.y( ); m2.y(); ,结果:one_x,two_x,two_y,two_y,9,4.3.2 类的封装,类的封装改变了用户传统的使用数据和代码的方式,它将方法和数据包含在一起构成一个独立的单元,可以通过设定单元内各个成员的的特性来控制对成员的访问。比如将一个字段定义为private,就可以防止外界直接访问这个字段。,封装一个类由两种做法:,1)为一个私有类定义公共读方法和写方法;,2)使用属性,用set和get访问器。,10,public class Student, private string studentname;,public string getstudentname( ), return(studentname);,public string setstudentname(string na), studentname=na;,class App, public static void Main( ),Student s1=new Student( );,s1.setstudentname(“zhanghua”);,Console.WriteLine(s1.getstudentname( );, ,不能使用语句,s1.studentname=“zhanghua”;,11,4.3.3 多态,多态指的是定义具有不同功能但相同名称的方法或属性的多个类的能力。C#中的多态可以由虚方法实现。,对于非虚方法,其实现是不变的,无论由基类实例调用还是由派生类实例调用都是相同的;而虚方法的实现可以由派生类取代,取代的过程称为重写。重写可以取代从基类继承的虚方法,但原虚方法的可访问性不能改变,静态方法和非虚方法不能被重写。,基类 public,virtual,void Show( ) . ,派生类 public,override,void Show( ) . ,12,虚方法重写举例:定义基类圆形Round,有一个成员半径,编写构造函数和计算面积的虚方法Area( );再定义一个派生类球形Sphere,对虚方法Area进行重写。,class Round, public double r;,public Round(double r), this.r=r; ,public virtual double Area( ), return(3.14*r*r); ,class Sphere:Round, public Sphere(double r):base(r), ,public override double Area( ), return(3.14*r*r*r); ,class App, static void Main( ), Sphere s=new Sphere(2);,Console.WriteLine(s.Area( ); ,13,1. this关键字,this关键字的作用是引用调用方法的当前实例,它可以从构造函数、实例方法和实例访问器中访问成员。,用法一:使用this来访问域和方法,void sayHello( ) Console.WriteLine(“My name is”+name);,与以下方法相同,void sayHello( ) Console.WriteLine(“My name is”+this.name);,用法二:解决局部变量与域同名问题,public Student(string name,string number),this.name=name; this.number=number,;,4.3.4 this和base关键字,14,this关键字举例,using System;,public class Student, public string name;,public string number;,public double subsidy=180;,public Student(string name,string number), this.name=name;,this.number=number; ,public void ShowInfo( ), Console.WriteLine(“0n1”,name,number; Console.WriteLine(“0”,AdvSubsidy.Caculate(,this,); ,public class AdvSubsidy, public static double Caculate(,student E,), return(1.5*(E.subsidy); ,public class AppMain, public static void Main( ), Student s1=new Student(“zhanghua”, “ 200454240”);,s1,.ShowInfo( ); ,15,this的注意事项,this指的是调用的“对象”本身,(1)通过this不仅可以引用该类中定义的域和方法,还可以引用该类的父类中定义的域和方法;,(2)在static静态方法中,不能使用this关键字。,16,2. base关键字:base指的是父类,1) 明确指明父类的域和方法,例如,父类Person中有一个域为age,则在子类Student中用age 、 this.age 、 base.age来访问age是完全一样的。,2) 当子类的方法隐藏或覆盖了父类的同名方法但又要调用父类的方法时,使用base关键字。,3) 想使用父类的构造方法。构造方法是不能继承的,但子类可以在构造方法中调用直接父类的构造方法,如,Student(string name,int age,string school),:base(name,age), this.school=school;,17,base(用法2)举例,using System;,public class A, public int a=10;,public void m( ), a+;,Console.WriteLine(a);,class B:A, new public int a=20;,new public void m( ), a+; /,base.m( );,Console.WriteLine(a);,public static void Main( ), A x=new A( );,Console.WriteLine(x.a); /10,x.m( ); /11,B y=new B( );,Console.WriteLine(y.a); /20,y.m( ); /11 21, ,如此处直接使用base.m( );则最后的结果为12而不是21。,18,4.4 运算符重载,4.4.1 运算符重载基本概念,4.4.2 单目运算符重载,4.4.3 双目运算符重载,19,4.4.1 多态之二:运算符的重载,运算符可以进行基本数据类型之间的运算,想把自己定义的类型进行类似“”之类的运算就要用到运算符重载,对于、运算符完全可以提供对应的方法来完成,比如,Decimal x,y;,X+=y; 可以写成 decimal.Add(x,y), x+=y;,运算符重载的一般形式是,public static,返回类型,operator,运算符(参数表), 语句; ,20,using System;,Class class1, public int x1,x2;,public class1(),x1=1; x2=2;,public static int operator +(class1 c), c.x1=c.x1+10;,c.x2=c.x2+5; ,Public void Show(), Console.WriteLine(“0,1”,x1,x2);,Class App,public static void Main( ), class1 mc=new class1( );,mc.Show( );,mc+;,mc.Show( ); ,结果:x1=1,x2=2,x1=11,x2=7,4.4.2,单目运算符重载 +,21,using System;,Class class1, public int x1,x2;,public class1(),x1=1; x2=2;,public static class1 operator +(class1 c1,class1 c2), c1.x1=c1.x1+c2.x1;,c1.x2=c1.x2+c2.x2;,return(c1); ,Public void Show(), Console.WriteLine(“0,1”,x1,x2);,Class App, public static void Main( ), class1 mc1=new class1( );,class1 mc2=new class1( );,mc1=mc1+mc2;,mc1.Show( ); ,结果:x1=2,x2=4,4.4.3,双目运算符重载 +,22,
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 图纸专区 > 大学资料


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!