《05_面向对象编程(二)继承封装和多态.pdf》由会员分享,可在线阅读,更多相关《05_面向对象编程(二)继承封装和多态.pdf(23页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、面向对象编程(二)继承封装和多态中软国际卓越培训中心4.3 4.3 继承、封装和多态继承、封装和多态4.3.1 继承4.3.2 封装4.3.3 多态4.3.4 this和base关键字4.3.1 类的继承继承的意思是一个类可以建立在另一个类的基础上,可以继承另一个类的属性和方法。我们把被继承的类叫做基类,通过继承产生的类叫做派生类(也可以叫做父类和子类)。继承的概念来源与现实的生活,比如汽车、轮船、火车飞机等就是继承于交通工具这个类,而汽车类中又可以派生出新的类,比如轿车、面包车等等。引入继承可以让我们重用以前写过的代码,新编写的代码可以在原来的基础上继承而来。在C#中继承的方式就是定义派生类
2、。在C#中,所有的类都是通过直接或间接地继承Object类得到的。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();派生类使用基类的方法基类的构造函数先执行再执行派生类的构造函数。2.域的继承、添加与隐藏1、
3、域的继承:子类可以继承父类的所有成员。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。3.方法的继承、添加与覆盖1、方法的继承:子类可以继承父类的所有方法。2、方法的添加:在子类定义中加上新的方法,以针对子类实现相应的功能。比如可以在Stu
4、dent类中定义分数的判断方法。3、方法的覆盖:子类定义与父类同名的方法。(多态之一)(1)定义同名但参数列表不同的方法,称为方法的重载;(2)定义同名且参数列表也相同的方法,称为新增,这时应该在同名方法前面用new修饰符;(3)定义同名且参数列表也相同的方法,并且父类中的方法用abstract/virtual进行修饰,子类中的方法用override进行了修饰,称为虚方法的覆盖。方法重载举例class parent public int add(int x,int y)return(x+y);class child:parent public int add(int x,int y,int z
5、)return(x+y+z);public static void Main()child c1=new child();c1.add(1,2,3);c1.add(4,5);分别使用了自己和父类的方法。方法隐藏举例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);使用了自己的方法。虚方法覆盖举例Cl
6、ass 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实
7、例m1.x();m2.x();m1.y();m2.y();结果:one_xtwo_xtwo_ytwo_y4.3.2 类的封装类的封装改变了用户传统的使用数据和代码的方式,它将方法和数据包含在一起构成一个独立的单元,可以通过设定单元内各个成员的的特性来控制对成员的访问。比如将一个字段定义为private,就可以防止外界直接访问这个字段。封装一个类由两种做法:1)为一个私有类定义公共读方法和写方法;2)使用属性,用set和get访问器。public class Student private string studentname;public string getstudentname()retu
8、rn(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”;4.3.3 多态多态指的是定义具有不同功能但相同名称的方法或属性的多个类的能力。C#中的多态可以由虚方法实现。对于非虚方法,其实现是不变的,
9、无论由基类实例调用还是由派生类实例调用都是相同的;而虚方法的实现可以由派生类取代,取代的过程称为重写。重写可以取代从基类继承的虚方法,但原虚方法的可访问性不能改变,静态方法和非虚方法不能被重写。基类public virtualvoid Show().派生类 public overridevoid Show().虚方法重写举例:定义基类圆形Round,有一个成员半径,编写构造函数和计算面积的虚方法Area();再定义一个派生类球形Sphere,对虚方法Area进行重写。class Round public double r;public Round(double r)this.r=r;publi
10、c 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();1.this关键字this关键字的作用是引用调用方法的当前实例,它可以从构造函数、实例方法和实例访问器中访问成员。用法一:使用this来访问域和方法void sayHe
11、llo()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 this4.3.4 this和和basebase关键字关键字this关键字举例using System;public class Student public string name;publi
12、c 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
13、.subsidy);public class AppMain public static void Main()Student s1=new Student(“zhanghua”,“200454240”);s1.ShowInfo();this的注意事项this指的是调用的“对象”本身(1)通过this不仅可以引用该类中定义的域和方法,还可以引用该类的父类中定义的域和方法;(2)在static静态方法中,不能使用this关键字。2.base关键字:base指的是父类1)明确指明父类的域和方法,例如,父类Person中有一个域为age,则在子类Student中用age、this.age、base.
14、age来访问age是完全一样的。2)当子类的方法隐藏或覆盖了父类的同名方法但又要调用父类的方法时,使用base关键字。3)想使用父类的构造方法。构造方法是不能继承的,但子类可以在构造方法中调用直接父类的构造方法,如Student(string name,int age,string school):base(name,age)this.school=school;base(用法2)举例using System;public class A public int a=10;public void m()a+;Console.WriteLine(a);class B:A new public in
15、t 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();/11B y=new B();Console.WriteLine(y.a);/20y.m();/11 21 如此处直接使用base.m();则最后的结果为12而不是21。4.4 4.4 运算符重载运算符重载4.4.1 运算符重载基本概念4.4.2 单目运算符重载4.4.3 双目运算符重载4.4.1 多态之二:运算符的重载运算符可以进行基本
16、数据类型之间的运算,想把自己定义的类型进行类似“”之类的运算就要用到运算符重载对于、运算符完全可以提供对应的方法来完成,比如Decimal x,y;X+=y;可以写成 decimal.Add(x,y)x+=y;运算符重载的一般形式是public static返回类型operator 运算符(参数表)语句;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(
17、)Console.WriteLine(“0,1”,x1,x2);Class Apppublic static void Main()class1 mc=new class1();mc.Show();mc+;mc.Show();结果:x1=1,x2=2x1=11,x2=74.4.2 4.4.2 单目运算符重载单目运算符重载+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=44.4.3 4.4.3 双目运算符重载双目运算符重载+