您好,欢迎访问三七文档
当前位置:首页 > 电子/通信 > 综合/其它 > 05_面向对象编程(二)继承封装和多态
面向对象编程(二)继承封装和多态中软国际卓越培训中心继承、封装和多态4.3.1继承4.3.2封装4.3.3多态4.3.4this和base关键字4.3.1类的继承继承的意思是一个类可以建立在另一个类的基础上,可以继承另一个类的属性和方法。我们把被继承的类叫做基类,通过继承产生的类叫做派生类(也可以叫做父类和子类)。继承的概念来源与现实的生活,比如汽车、轮船、火车飞机等就是继承于交通工具这个类,而汽车类中又可以派生出新的类,比如轿车、面包车等等。引入继承可以让我们重用以前写过的代码,新编写的代码可以在原来的基础上继承而来。在C#中继承的方式就是定义派生类。在C#中,所有的类都是通过直接或间接地继承Object类得到的。1.派生子类定义派生类的基本形式:class派生类名字:基类名字{派生类的代码;}publicclassParent{publicParent(){......定义一个构造函数}publicvoidWriteItem(){.......定义方法}}publicclassChild:Parent{publicChild(){......派生类的构造函数}publicstaticvoidMain(){Childa=newChild();a.WriteItem();}}派生类使用基类的方法基类的构造函数先执行再执行派生类的构造函数。2.域的继承、添加与隐藏1、域的继承:子类可以继承父类的所有成员。2、域的添加:在子类定义中加上新的域变量,就可以使得子类具有比父类多的属性。如:classStudent:Person{stringschool;intscore;}子类比父类多了两个成员:school、score。3、域的隐藏:子类重新定义一个从父类中继承的域变量。classA{publicinta;}classB:A{newpublicinta;}使用new修饰符来隐藏父类的同名成员a。3.方法的继承、添加与覆盖1、方法的继承:子类可以继承父类的所有方法。2、方法的添加:在子类定义中加上新的方法,以针对子类实现相应的功能。比如可以在Student类中定义分数的判断方法。3、方法的覆盖:子类定义与父类同名的方法。(多态之一)(1)定义同名但参数列表不同的方法,称为方法的重载;(2)定义同名且参数列表也相同的方法,称为新增,这时应该在同名方法前面用new修饰符;(3)定义同名且参数列表也相同的方法,并且父类中的方法用abstract/virtual进行修饰,子类中的方法用override进行了修饰,称为虚方法的覆盖。方法重载举例classparent{publicintadd(intx,inty){return(x+y);}classchild:parent{publicintadd(intx,inty,intz){return(x+y+z);}publicstaticvoidMain(){childc1=newchild();c1.add(1,2,3);c1.add(4,5);}分别使用了自己和父类的方法。方法隐藏举例classparent{publicintadd(intx,inty){return(x+y);}classchild:parent{newpublicintadd(intx,inty){return(x+y+10);}publicstaticvoidMain(){childc1=newchild();c1.add(4,5);}使用了自己的方法。虚方法覆盖举例Classone{publicvoidx(){Console.WriteLine(“one_x”);}publicvirtualvoidy(){Console.WriteLine(“one_y”);}}Classtwo:one{newpublicvoidx()//隐藏父类中的同名方法{Console.WriteLine(“two_x”);}publicoverridevoidy()//重写同名方法{Console.WriteLine(“two_y”);}Classtest{publicstaticvoidMain(){twom2=newm2();onem1=m2;//m1指向m2实例m1.x();m2.x();m1.y();m2.y();}}结果:one_xtwo_xtwo_ytwo_y4.3.2类的封装类的封装改变了用户传统的使用数据和代码的方式,它将方法和数据包含在一起构成一个独立的单元,可以通过设定单元内各个成员的的特性来控制对成员的访问。比如将一个字段定义为private,就可以防止外界直接访问这个字段。封装一个类由两种做法:1)为一个私有类定义公共读方法和写方法;2)使用属性,用set和get访问器。publicclassStudent{privatestringstudentname;publicstringgetstudentname(){return(studentname);}publicstringsetstudentname(stringna){studentname=na;}}classApp{publicstaticvoidMain(){Students1=newStudent();s1.setstudentname(“zhanghua”);Console.WriteLine(s1.getstudentname());}}不能使用语句s1.studentname=“zhanghua”;4.3.3多态多态指的是定义具有不同功能但相同名称的方法或属性的多个类的能力。C#中的多态可以由虚方法实现。对于非虚方法,其实现是不变的,无论由基类实例调用还是由派生类实例调用都是相同的;而虚方法的实现可以由派生类取代,取代的过程称为重写。重写可以取代从基类继承的虚方法,但原虚方法的可访问性不能改变,静态方法和非虚方法不能被重写。基类publicvirtualvoidShow(){...}派生类publicoverridevoidShow(){...}虚方法重写举例:定义基类圆形Round,有一个成员半径,编写构造函数和计算面积的虚方法Area();再定义一个派生类球形Sphere,对虚方法Area进行重写。classRound{publicdoubler;publicRound(doubler){this.r=r;}publicvirtualdoubleArea(){return(3.14*r*r);}}classSphere:Round{publicSphere(doubler):base(r){}publicoverridedoubleArea(){return(3.14*r*r*r);}}classApp{staticvoidMain(){Spheres=newSphere(2);Console.WriteLine(s.Area());}}1.this关键字this关键字的作用是引用调用方法的当前实例,它可以从构造函数、实例方法和实例访问器中访问成员。用法一:使用this来访问域和方法voidsayHello(){Console.WriteLine(“Mynameis”+name);}与以下方法相同——voidsayHello(){Console.WriteLine(“Mynameis”+this.name);}用法二:解决局部变量与域同名问题publicStudent(stringname,stringnumber){this.name=name;this.number=number;}4.3.4this和base关键字this关键字举例usingSystem;publicclassStudent{publicstringname;publicstringnumber;publicdoublesubsidy=180;publicStudent(stringname,stringnumber){this.name=name;this.number=number;}publicvoidShowInfo(){Console.WriteLine(“{0}\n{1}”,name,number;Console.WriteLine(“{0}”,AdvSubsidy.Caculate(this));}}publicclassAdvSubsidy{publicstaticdoubleCaculate(studentE){return(1.5*(E.subsidy);}}publicclassAppMain{publicstaticvoidMain(){Students1=newStudent(“zhanghua”,“200454240”);s1.ShowInfo();}}this的注意事项this指的是调用的“对象”本身(1)通过this不仅可以引用该类中定义的域和方法,还可以引用该类的父类中定义的域和方法;(2)在static静态方法中,不能使用this关键字。2.base关键字:base指的是父类1)明确指明父类的域和方法,例如,父类Person中有一个域为age,则在子类Student中用age、this.age、base.age来访问age是完全一样的。2)当子类的方法隐藏或覆盖了父类的同名方法但又要调用父类的方法时,使用base关键字。3)想使用父类的构造方法。构造方法是不能继承的,但子类可以在构造方法中调用直接父类的构造方法,如Student(stringname,intage,stringschool):base(name,age){this.school=school;}base(用法2)举例usingSystem;publicclassA{publicinta=10;publicvoidm(){a++;Console.WriteLine(a);}}classB:A{newpublicinta=20;newpublicvoidm(){a++;//base.m();Console.WriteLine(a);}publicstaticvoidMain(){Ax=newA();Console.WriteLine(x.a);//10x.m();//11By=newB();Console.WriteLine(y.a);//20y.m();//1121}}如此处直接使用base.m();则最后的结果为12而不是21。4.4运算符重载4.4.1运算符重载基本概念4.4.2单目运算符重载4.4.3双目运算符重载4.4.1多态之二:运算符的重载运算符可以进行基本数据类型之间的运算,想把自己定义的类型进行类似“+-”之类的运算就要用到运算符重载.对于+、—运算符完全可以提供对应的方法来完成,比如Decimalx,y;X+=y;可以写成decimal.Add(x,y){x+=y;}运算符重载的一般形式是publicstatic返回类型operator运算符(参数表){语句;}usingSystem;Classclass1{publicintx1,x2;publicclass1(){x1=1;x2=2;}publicstaticintoperator++(class1c){c.x1=c.x1+10;c.x2=c.x2+5;}PublicvoidShow(){Console.WriteLine(“{0},{1}”,x1,x2);}}ClassApp{publicstaticvoidMain(){class1mc=newclass1();mc.Show();mc++;mc.Show();}}结果:x1=1,x2=2x1=11,x2=74.4.2单目运算符重载++usingSystem;Classclass1{publicintx1,x2;publicclass1(){x1=1;x2=2;}publicstaticclass1operator+(class1c1,class1c2){c1.x1=c1.x1+c2.x1;c1.
本文标题:05_面向对象编程(二)继承封装和多态
链接地址:https://www.777doc.com/doc-5097980 .html