您好,欢迎访问三七文档
当前位置:首页 > 电子/通信 > 综合/其它 > 第5章-面向对象高级-继承
让IT教学更简单,让IT学习更有效课前练习•定义一个Time类,包括:•三个私有数据成员时,分,秒;•两个构造函数,一个通过传入的参数对时、分、秒进行初始化,一个无参构造函数获取系统当前时间(System.DateTime.Now.Hour,System.DateTime.Now.Minute,System.DateTime.Now.Second分别取得当前的时、分、秒),•三个自读属性对时、分、秒读取•一个方法用于对秒增加1秒(voidaddseconed(),注意六十进位问题•一个输出时、分、秒的输出方法voidoutput();•创建对象进行测试让IT教学更简单,让IT学习更有效让IT教学更简单,让IT学习更有效面向对象-继承让IT教学更简单,让IT学习更有效目录类的继承sealed关键字让IT教学更简单,让IT学习更有效5.1类的继承•5.1.1继承的概念−在现实生活中,继承一般指的是子女继承父辈的财产。在程序中,继承描述的是事物之间的所属关系,通过继承可以使多种事物之间形成一种关系体系。−例如猫和狗都属于动物,在程序中便可认为猫和狗继承自动物,同理波斯猫和巴厘猫继承自猫,而沙皮狗和斑点狗继承自狗,这些动物之间会形成一个继承体系。具体如下图所示。让IT教学更简单,让IT学习更有效5.1类的继承−在C#中,类的继承是指在一个现有类的基础上去构建一个新的类,构建出来的新类被称作子类,现有的类被称作父类,子类会自动拥有父类所有可继承的属性和方法。让IT教学更简单,让IT学习更有效继承关系在面向对象环境中,不同类的对象间有各种关系:•继承关系:让IT教学更简单,让IT学习更有效父类(超类)继承关系让IT教学更简单,让IT学习更有效父类子类继承关系让IT教学更简单,让IT学习更有效父类子类继承父母的特征,如身高、肤色和行为继承关系让IT教学更简单,让IT学习更有效你可以在超类和它的子类之间建立关系。下图显示了超类的子类的层次。继承关系AutomobileMitsubishCarBusFordBMWToyota超类超类(父类)Automobile属性:车轮、引擎、颜色等,前进、加速、后退、停止等方法让IT教学更简单,让IT学习更有效思考创建搅拌器、VCR、洗衣机、音响类、对象的层次,并且在可能的地方进行归纳。答案:下图显示了类对象的层次。电子设备娱乐设备家用设备彩电VCR立体声搅拌器洗衣机让IT教学更简单,让IT学习更有效组合关系面向对象编程允许你组成一个对象,它包括另一个对象作为它的部分。这个组成对象的机制被称为组合。汽车与轮胎的关系公司与部门的关系让IT教学更简单,让IT学习更有效思考识别下面类对间的关系:1.电视–扬声器2.哺乳动物–老虎3.外衣–衬衫4.杯子–茶5.计算机–微处理器答案:5和1是组合关系的例子。3和2是继承关系的例子。4没有表现出任何关系。茶不是杯子的属性。让IT教学更简单,让IT学习更有效利用关系面向对象编程允许类使用另一个类。这个关系类型被称为利用。让IT教学更简单,让IT学习更有效思考在下面的部门商店的场景中识别类和它们的利用关系。有几个柜台,商店的每个柜台由一个销售人员负责,它销售特定的商品。顾客来到一个柜台。依赖顾客购买产品的想法,销售人员销售产品给客户并且接受支付。答案:上述场景的利用关系是:销售人员管理柜台。每个柜台处理一个特定的产品。顾客买一个产品。顾客付钱给销售人员。名词动词名词让IT教学更简单,让IT学习更有效实例化关系:实例化关系是类与类的实例之间的关系。这种关系称为实例化。xxx是xxx公共汽车是机动车香蕉是水果西南石油大学是一所高校让IT教学更简单,让IT学习更有效在C#中,继承实际就是子类继承父类的数据成员和成员函数。继承或从其他类获得属性的类被称为派生类。属性被派生的类被称为基类。在面向对象编程中,基类实际是超类,派生类是子类。基类、超类是一回事派生类、子类是一回事使用类和继承让IT教学更简单,让IT学习更有效实现继承让IT教学更简单,让IT学习更有效•定义一个animal类,具有数据成员name,age,和赋值方法voidsetdata给name和age成员赋值,一个输出output方法输出name和age的值•定义一个dog类,具有数据成员name,age和type(string类型),具有赋值方法voidsetdog给name、age和type数据成员赋值,output_dog方法输出name、age和type的值让IT教学更简单,让IT学习更有效基类和派生类的写法和继承关系•基类中公有成员在派生类的访问及类外访问情况让IT教学更简单,让IT学习更有效•基类中的公用成员在派生类及其类外均可直接访问•基类的公有成员在派生类中仍然是公有成员让IT教学更简单,让IT学习更有效•基类中私有成员在派生类的访问及类外的访问让IT教学更简单,让IT学习更有效•基类的私有成员在派生类中没法直接使用,在类外也不能访问•继承的基类私有成员在派生类中仍然是私有成员让IT教学更简单,让IT学习更有效•基类中保护成员在派生类的访问和类外访问情况让IT教学更简单,让IT学习更有效•基类中保护成员在派生类可直接使用,在派生类中仍然是保护成员•保护成员在类外部是没法访问的让IT教学更简单,让IT学习更有效•派生类书写形式•[public或internal]class类名:基类名•{•}让IT教学更简单,让IT学习更有效5.1类的继承注意:在类的继承中,需要注意一些问题,具体如下:‒派生类自然继承基类的成员‒基类中的公用成员在派生类及其类外均可直接访问–继承的公有成员在派生类中仍然是公有成员‒基类的私有成员在派生类中没法直接使用,在类外也不能访问–继承的基类私有成员在派生类中仍然是私有成员‒基类中保护成员在派生类可直接使用,在派生类中仍然是保护成员‒保护成员在类外部是没法访问的让IT教学更简单,让IT学习更有效−继承具有单一性,也就是说一个类只能有一个直接的父类,例如下面的语句是错误的。−多个类可以继承同一个父类,例如下面的语句是正确的。classA{}classB{}classC:A,B{}//C类不可以同时继承A类和B类classA{}classB:A{}classC:A{}//类B和类C都可以继承类A让IT教学更简单,让IT学习更有效5.1类的继承−在C#中,多层继承是可以的,即一个类的父类可以再去继承其他类,例如C类继承自B类,B类又继承自A类,这时,C类也可称作A类的子类,下面的语句是正确的。classA{}classB:A{}//B类继承自A类,B类是A类的子类classC:B{}//C类继承自B类,C类是B类的子类让IT教学更简单,让IT学习更有效•举例让IT教学更简单,让IT学习更有效课堂练习•Employee类是一个基类,它包含_name和_qualification两个私有成员(string类型)以及用于接收(voidsetdata(stringname,stringqualificatin))和显示信息(voiddisplay())的两个方法。名为Programmer的派生类包含_languages、_os和_databases3个私有成员(string类型)和用于接收和显示信息的两个方法。为Programmer类创建一个对象,并调用派生类的方法来存储和输出值。让IT教学更简单,让IT学习更有效让IT教学更简单,让IT学习更有效•派生类中构造函数的调用顺序让IT教学更简单,让IT学习更有效•创建派生类对象先调用继承的基类构造函数,然后再调用派生类构造函数•派生类构造函数后面没有指定基类构造函数先调用默认无参的基类构造函数让IT教学更简单,让IT学习更有效•派生类对象调用继承的基类有参构造函数让IT教学更简单,让IT学习更有效课堂练习•用C#编写一个程序,使用Employee和Programmer两个类。Employee具有姓名和学历等属性,通过构造函数给属性赋初值(提供无参和有参构造函数),需要提供方法实现以接收和显示这些属性的值。Programmer类具有Employee类属性,还具有代表其技能集的属性,这些属性表明程序员在编程语言、操作系统和数据库方面的专业知识,通过构造函数为这些属性赋初值(提供无参和有参构造函数)。同样地,需要提供方法实现以接收和显示这些属性的值。通过主函数创建派生类对象来显示所以属性的信息。•分析:•Employee类是一个基类,它包含_name和_qualification两个成员以及构造函数、接收和显示信息的三个方法。名为Programmer的派生类包含_languages、_os和_databases3个成员和构造函数、用于接收和显示信息的两个方法。让IT教学更简单,让IT学习更有效•定义一个Account类为基类,具有账号num,余额(balance)数据信息,具有创建账户voidcreate(stringnum,floatbalance),存款voiddeposi(floatnum),取款voidwithdraw(floatnum)和查询余额voiddisplay(),定义有参和无参构造函数•其中取款操作不允许余额小于0•定义派生类Vipaccount,定义有参和无参构造函数,取款操作重新实现允许透支1000元(提示由于balance需要变动,所以balance在基类中是私有成员没法在派生类中直接访问,所以需要在基类中定义公有floatgetbalance()和voidsetbalance(floatnum)•通过主函数定义派生类对象,并调用相关方法进行测试让IT教学更简单,让IT学习更有效5.1类的继承•5.1.2构造方法的执行过程−在上一章中学习了构造方法的定义以及重载,了解到构造方法可以用于初始化类的静态成员和实例成员。在继承关系中,构造方法的执行过程会变得有些不一样,下面进行具体分析。−当一个类的对象被创建时,如果该类拥有父类的话,在调用自身构造方法的同时还会调用父类的构造方法,其具体执行过程如下图所示。让IT教学更简单,让IT学习更有效5.1类的继承从图中可以看出,子类在实例化对象时,首先会调用父类的构造方法,然后再调用自身的构造方法。初始化实例成员调用父类构造方法调用自身的构造方法让IT教学更简单,让IT学习更有效5.1类的继承•5.1.3隐藏同名基类方法−子类在继承父类时可以对父类的成员进行扩展,如果子类中出现与父类同名的方法,那么在调用该方法时程序就不能明确该方法是属于父类还是子类,这时编译器就会提示使用new关键字隐藏基类方法。让IT教学更简单,让IT学习更有效–接下来,通过一个案例来演示这种情况,具体如下。5.1类的继承让IT教学更简单,让IT学习更有效5.1类的继承程序编译出现警告,结果如下图所示。让IT教学更简单,让IT学习更有效5.1类的继承–根据程序编译警告,将程序第12行代码添加一个new关键字,修改后的代码片段如下所示。classDog:Animal{publicnewvoidShout()//与父类方法重名{Console.WriteLine(汪汪....);}}让IT教学更简单,让IT学习更有效5.1类的继承–程序修改后的运行结果如下图所示。在示例中,Dog类继承Animal类,同时Dog类中存在与父类相同的方法Shout(),因此,使用new关键字可以明确告诉编译器执行Dog类中的Shout()方法,解决继承关系中方法同名的问题。让IT教学更简单,让IT学习更有效•通过base关键字访问基类的成员•通过new关键字实现派生类隐藏基类同名方法让IT教学更简单,让IT学习更有效讨论•派生类对象创建时,派生类的构造方法与基类的构造方法执行顺序•在没有指定基类构造方法情况下,派生类无参构造方法将调用基类的哪个构造方法•派生类的析构函数与基类的析构函数的执行顺序先执行基类的构造方法,再执行派生类的构造方法调用基类的无参数构造方法与构造方法执行顺序相反,先调用派生类的析构方法再调用基类的析构方法让IT教
本文标题:第5章-面向对象高级-继承
链接地址:https://www.777doc.com/doc-4674012 .html