C#初级入门教程PPT_第6章_第1页
C#初级入门教程PPT_第6章_第2页
C#初级入门教程PPT_第6章_第3页
C#初级入门教程PPT_第6章_第4页
C#初级入门教程PPT_第6章_第5页
已阅读5页,还剩35页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第6章面向对象编程进阶,本章要点,通过本章的学习,使读者:理解基类和派生类的概念,理解继承是如何提高软件可重用性的熟练掌握派生类的定义方法和应用掌握接口概念和实现方法,能够用接口技术实现多继承功能了解委托和事件的概念、声明方法和应用了解并掌握异常处理方法,6.1继承与派生的概念,6.1.1继承,继承允许在已有类的基础上创建新的类,新类可以从一个或多个既有类中继承函数和数据,而且可以加入新的函数和数据,6.1.2派生,由已存在的类派生出的新类称为派生类,又称为子类。在C+语言中,一个派生类可以从一个基类派生,也可以从多个基派生。但C#不支持多基派生,只支持单基派生。从一个基类派生的继承称为单继承;,图6-1类之间的继承与派生关系,6.2类的继承,6.2.1基类与派生类在C#中,派生类的语法格式如下:,class子类名称:父类名类的主体,【例6-1】创建一个一般学生类Student,然后创建Student类的子类大学生类CStudent,体会成员变量和成员方法的继承。,classStudent/定义一般学生类,父类publicstaticstringsClassName=软件一班;/静态字段publicstringSName=王丽;/公有字段privateintAge=21;/私有字段,不被继承protectedstringSex=女;/保护成员变量publicvoidWriteAge()/公有成员方法Console.WriteLine(this.Age);privatevoidWriteSName()/私有成员方法,不被继承Console.WriteLine(SName);,Student,classCStudent:Student/定义大学生类,子类privatestringDepartment;/定义私有成员变量publicCStudent(string_Department,string_SName,string_Sex)Department=_Department;SName=_SName;Sex=_Sex;/定义公有成员方法,成员变量SName,Sex,sClassName由父类继承而来publicvoidWriteCStudentInfo()Console.Write(0,1,2,3,SName,Sex,Department,sClassName);/此成员方法来自父类WriteAge();classProgramstaticvoidMain(stringargs)CStudentcstu1=newCStudent(计算机系,张三,男);cstu1.WriteCStudentInfo();,CStudent类继承自Student类,6.2.2构造函数与析构函数,派生类构造函数的一般格式如下:,():base();,在派生类构造函数的参数表中,给出了初始化基类数据和新增一般成员数据所需要的全部参数。,派生类的构造函数执行顺序如下:(1)按被继承时说明顺序,调用基类的构造函数。(2)调用派生类构造函数体中的内容。,2析构函数当对象被删除时,派生类的析构函数被执行。由于析构函数也不能被继承,因此在执行派生类的析构函数时,基类的析构函数也将被调用。执行顺序是:,执行派生类的析构函数执行基类的析构函数,其顺序与执行构造函数时的顺序正好相反,classStudentpublicstaticstringsDepartment=软件工程系;privatestringsClass;/私有字段publicStudent(stringc)/构造函数sClass=c;Student()Console.WriteLine(“执行父类析构函数”);publicvoidWriteClass()Console.WriteLine(this.sClass);classCStudent:Student/定义大学生类,即子类privateintAge;/定义私有字段privatestringSName,Sex;/定义私有字段/定义构造函数publicCStudent(stringc,stringn,strings,inta):base(c)SName=n;Sex=s;Age=a;CStudent()Console.WriteLine(执行子类析构函数);,分析该程序的输出结果?,publicvoidWriteCStudentInfo()Console.Write(0,1,2,3,CStudent.sDepartment,SName,Sex,Age);WriteClass();/此成员方法来自父类classProgramstaticvoidMain(stringargs)CStudentcstu1=newCStudent(O6级软件4班,张三,男,23);cstu1.WriteCStudentInfo();,分析该程序的输出结果?,6.2.3成员的继承、添加和隐藏,派生类重新定义一个与从基类继承来的字段(或方法)完全相同时,称为字段(或方法)的隐藏,表示新的字段(或方法)挡住了来自基类的字段(或方法)。但是这并不意着来自基类的字段(或方法)不存在了,或者不能用了,而是表示被隐藏的字段(或方法)只能被来自同样的基类方法所访问。如果派生类一定要访问被隐藏的字段(或方法),则需要在该字段(或方法)前加上“base.”以表示是来自基类的同名字段(或方法)。为了清晰地表明派生类隐藏基类的同名成员的意图,派生类中同名成员应该使用new修饰符。否则编译时会有提示性的警告。,publicclassPersonprivatestringname;privateintage;privatelongID;publicPerson(stringn,inta,longi)name=n;age=a;ID=i;publicvoidDisplay()Console.WriteLine(Name:0,name);Console.WriteLine(Age:0,age);Console.WriteLine(ID:0,ID);publicclassEmployee:Personprivatestringdepartment;privatedoublesalary;publicEmployee(stringn,inta,longi,stringd,doubles):base(n,a,i)department=d;salary=s;,分析该程序的输出结果?,newpublicvoidDisplay()base.Display();Console.WriteLine(department:0,department);Console.WriteLine(Salary:0,salary);classProgramstaticvoidMain(stringargs)Employeecstu1=newEmployee(张三,20,60012L,计算机系,2601.89);cstu1.Display();,分析该程序的输出结果?,6.2.4关键字base和this,base和this类似,但base指代的是基类的对象,This则是当前类的对象。(1)使用base关键字访问基类的字段和方法newpublicvoidDisplay()base.Display();/调用基类被隐藏的方法Console.WriteLine(department:0,department);Console.WriteLine(Salary:0,salary);,6.2.4关键字base和this,(2)使用base关键字调用基类的构造函数派生类继承基类中除了构造函数、析构函数以外的所有成员,但是,派生类仍然可以调用直接基类的构造函数。参看例6-2、例6-3。(3)this关键字用于访问当前类中的各个元素this.成员变量或this.成员方法(参数)(4)this关键字将对象作为参数传递到其他方法方法名(this),【例6-4】this关键字的使用,classEmployeeprivatestringname;privatedoublesalary=5000;publicEmployee(stringname)=name;/用this限定name字段publicvoidprintEmployee()Console.WriteLine(Name:0,name);/用this关键词将对象作为参数调用CalcTax()Console.WriteLine(Taxes:0:C,Tax.CalcTax(this);publicdoubleMySalarygetreturnsalary;,classTaxpublicstaticdoubleCalcTax(EmployeeE)return0.07*E.MySalary;classMainClassstaticvoidMain()EmployeeA1=newEmployee(张三);A1.printEmployee();/显示结果程序运行结果:,分析该程序的输出结果?,6.2.5访问控制,1对类的访问控制在C#语言中,对类可以使用public和internal访问控制修饰符来限制其可见性。,public:称公开类,它可以被本工程和其它工程的代码来访问。internal:只能被当前工程的代码来访问。,6.2.5访问控制,2对类成员的访问控制对类中的方法和成员变量可以使用public、private、protected、internal和protectedinternal访问控制修饰符来限制其可见性。,(1)public:对公有成员访问不受限制,可以从类的外部、内部和派生类访问公有成员;(2)private:私有成员只能被所属类中的成员访问,不能被外部和子类访问。(3)protected:只能被所属类和子类的方法访问。(4)internal:只能被同一工程中的方法访问。(5)protectedinternal:能被该类的子类和同一工程中的任何类的方法访问。,【例6-6】类成员的可见性示例,classParentprivateinti;/只能被Parent类内部方法访问protectedintj;/能被子类的方法访问privatevoidDisplay()Console.WriteLine(我是父类);protectedvoidSetvalue()/可以被子类访问j=1;i=2;publicvoidMyDvalue()Console.WriteLine(i=0,j=1,i,j);,【例6-6】类成员的可见性示例(续),classChild:Parentpublicintk;publicvoidDisplay()Console.WriteLine(我是子类);internalvoidChange()/i=1;/不能访问父类的私有成员Setvalue();/能访问父类的protected方法MyDvalue();/能访问父类的public方法,【例6-6】类成员的可见性示例(续),classProgramstaticvoidMain(stringargs)Parentx=newParent();Childy=newChild();x.MyDvalue();/x.i=1;/不能访问/x.j=2;/不能访问/x.Setvalue();被protected修饰,不能访问/x.Display();被Private修饰,不能访问y.Change();/public修饰可以访问y.Display();/internal修饰的可以访问y.MyDvalue();/被继承y.k=20;Console.WriteLine(0,y.k);,6.3类的多态,6.3.1虚方法类的方法使用virtual关键字修饰后就成为虚方法,其实现包括两个步骤:,(1)对基类中要实现多态性的方法,用virtual关键字修饰;(2)对派派生类中的同名方法,使用override关键字修饰,并在方法中自由地编写方法实现。,【例6-7】用虚方法实现多态,classFatherpublicvirtualvoidspeak()Console.WriteLine(在父类中调用speak()方法);publicvoidsmile()Console.WriteLine(今天天气真好!);classSun:Fatherpublicoverridevoidspeak()Console.WriteLine(在子类中调用speak()方法);,【例6-7】用虚方法实现多态(续),classProgramstaticvoidMain(stringargs)Fatherf1=newFather();Suns1=newSun();f1.speak();f1.smile();s1.speak();s1.smile();Console.ReadLine();程序的执行结果为:在父类中调用speak()方法今天天气真好!在子类中调用speak()方法今天天气真好!,6.3.2抽象类,被关键字abstract修饰的类构成抽象类。抽象类只能当作其他类的基类,不能够被实例化。建立一个抽象类相当构建一个模板,其中定义了类的成员,但不提供成员的实现,而是由派生类根据具体的需要来实现。,【例6-8】抽象类和抽象方法的实现。,publicabstractclassFather/抽象类publicabstractvoidspeak();/抽象方法publicabstractvoidsmile();/抽象方法classBoy:Fatherpublicoverridevoidspeak()Console.WriteLine(男孩类中调用speak()方法);publicoverridevoidsmile()Console.WriteLine(今天天气真好!);,【例6-8】抽象类和抽象方法的实现(续),classGirl:Fatherpublicoverridevoidspeak()Console.WriteLine(女孩类中调用speak()方法);publicoverridevoidsmile()Console.WriteLine(女孩甜甜的笑!);,【例6-8】抽象类和抽象方法的实现(续),classProgramstaticvoidMain(stringargs)Fatherf1;Boys1=newBoy();Girls2=newGirl();f1=s1;f1.speak();f1.smile();f1=s2;f1.speak();f1.smile();Console.ReadLine();,6.4接口,C#仅支持类的单继承,即一个类只有一个父类。单继承使C#程序层次关系清晰,可读性强。C#通过使用一个新技术接口,巧妙地实现了与多继承同样的功能,同时又避免了编程的复杂性。,6.4.1接口的声明,接口和类一样,可以有方法、属性和事件等成员,但与类不同的是,接口仅仅提供成员的声明,并不提供成员的实现。接口成员在具体的类或结构代码中实现。接口的声明格式为:,修饰符interface接口名:父接口名列表/接口体包括属性、方法、事件和索引器声明/例如,方法声明如下返回类型方法名(参数列表);,【例6-9】声明一个接口ISharp。,publicinterfaceIsharpdoubleWidthget;set;/属性成员doubleGetArea();/方法成员该接口定义了一个方法和一个属性。声明接口时,需要注意以下内容:接口的所有成员都被定义为公有的,使用其它修饰符是错误的;接口不能包含常量、域;,6.4.2接口的实现,在类中实现接口需要两个步骤。首先,在类名称后面以冒号指定类要实现的一个或者多个接口,多个接口用逗号分开。其次,在类中创建实际的类成员。这和通常创建类成员的过程是一样的。【例6-10】实现例6-9Isharp接口。,【例6-10】实现例6-9Isharp接口。,publicinterfaceIsharpedoubleGetArea();doubleWidthget;set;publicclassRectangle:ISharpe/声明两个字段publicdoubledWidth;publicdoubledHeight;/构造函数publicRectangle(double_dWidth,double_dHeight)this.dHeight=_dHeight;this.dWidth=_dWidth;,【例6-10】实现例6-9Isharp接口(续),publicdoubleWidth/接口

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论