您好,欢迎访问三七文档
当前位置:首页 > 电子/通信 > 综合/其它 > 面向对象程序设计-教案chp5-2014-2015学期
面向对象程序设计教案chp52014-2015(2)学期-1-教学安排上课周次第8、9、10周上课方式讲授与演示结合教学环境计算机实验室课时6学时教学内容继承和多态教学目标掌握C#面向对象中继承和多态的使用方法教学重点继承;多态教学难点继承;多态教案教学过程备注内容继承和多态授课过程1.继承C#语言类继承有如下特点:C#语言只允许单继承,即派生类只能有一个基类。C#语言继承是可以传递的,如果C从B派生,B从A派生,那么C不但继承B的成员,还要继承A中的成员。派生类可以添加新成员,但不能删除基类中的成员。派生类不能继承基类的构造函数、析构函数和事件。但能继承基类的属性。派生类可以覆盖基类的同名成员,如果在派生类中覆盖了基类同名成员,基类该成员在派生类中就不能被直接访问,只能通过base.基类方法名访问。派生类对象也是其基类的对象,但基类对象却不是其派生类的对象。例如,前边定义的雇员类Employee是Person类的派生类,所有雇员都是人类,但很多人并不是雇员,可能是学生,自由职业者,儿童等。因此C#语言规定,基类的引用变量可以引用其派生类对象,但派生类的引用变量不可以引用其基类对象。(1)基类和派生类继承提供了创建新类的一种方法,继承对开发者来说就是代码共享。通过继承创建的子类是作为另一个类的扩充或修正所定义的一个类。面向对象程序设计教案chp52014-2015(2)学期-2-授课过程子类从超类(父类)中继承所有方法和变量。子类和超类之间是特化与范化的关系。如果要声明一个类派生于另一个类,可以使用下面的语法:classMyDerivedClass:MyBaseClass{//functionsanddatamembershere}注意:这个语法非常类似于C++和Java中的语法,但是,C++程序员习惯于使用公共和私有继承的概念,要注意C#不支持私有继承,因此基类名上没有public或private限定符。支持私有继承会大大增加语言的复杂性,实际上私有继承在C++中也很少使用。如果类(或结构)也派生于接口,则用逗号分隔开基类和接口:publicclassMyDerivedClass:MyBaseClass,IInterface1,IInterface2{//etc.}对于结构,语法如下:publicstructMyDerivedStruct:IInterface1,IInterface2{//etc.}如果在类定义中没有指定基类,C#编译器就假定System.Object是基类。因此下面的两段代码生成相同的结果:classMyClass:Object//derivesfromSystem.Object{//etc.}和classMyClass//derivesfromSystem.Object{//etc.}第二种形式比较常用,因为它较简单。C#支持object关键字,它用作System.Object类的假名,所以也可以编写下面的代码:classMyClass:object//derivesfromSystem.Object{面向对象程序设计教案chp52014-2015(2)学期-3-//etc.}如果要引用Object类,可以使用object关键字,智能编辑器(如VisualStudio)会识别它,因此便于编辑代码。(2)隐藏基类成员在派生类中,通过声明与基类完全相同新成员,可以覆盖基类的同名成员,完全相同是指函数类型、函数名、参数类型和个数都相同。如上例中的方法Display()。派生类覆盖基类成员不算错误,但会导致编译器发出警告。如果增加new修饰符,表示认可覆盖,编译器不再发出警告。请注意,覆盖基类的同名成员,并不是移走基类成员,只是必须用如下格式访问基类中被派生类覆盖的方法:base.Display()。如果签名相同的方法在基类和派生类中都进行了声明,但该方法没有声明为virtual和override,派生类方法就会隐藏基类方法。在大多数情况下,是要重写方法,而不是隐藏方法,因为隐藏方法会存在为给定类的实例调用错误方法的危险。但是,如下面的例子所示,C#语法可以确保开发人员在编译时收到这个潜在错误的警告,使隐藏方法更加安全。这也是类库开发人员得到的版本方面的好处。(3)base关键字base关键字用于从派生类中访问基类成员,它有两种基本用法:①在定义派生类的构造函数中,指明要调用的基类构造函数,由于基类可能有多个构造函数,根据base后的参数类型和个数,指明要调用哪一个基类构造函数。参见上节雇员类Employee构造函数定义中的base的第一种用法。②在派生类的方法中调用基类中被派生类覆盖的方法。参见上节雇员类Employee的Display()方法定义中的base的第二种用法。(4)对象的生命周期对于派生类对象而言,它在创建时将自顶向下地调用各级基类的构造函数,最后调用自身的构造函数;销毁时首先调用自身的析构函数,而后自底向上地调用各级基类的析构函数.2.多态性在面向对象的系统中,多态性是一个非常重要的概念。C#支持两种类型的多态性,第一种是编译时的多态性,一个类的对象调用若干同名方法,系统在编译时,根据调用方法的实参类型及实参的个数决定调用那个同名方法,实现何种操作。编译时的多态性是通过方法重面向对象程序设计教案chp52014-2015(2)学期-4-载来实现的。C#语言的方法重载以及操作符重载和C++语言的基本一致。第二种是运行时的多态性,是在系统运行时,不同对象调用一个名字相同,参数的类型及个数完全一样的方法,会完成不同的操作。C#运行时的多态性通过虚方法实现。在类的方法声明前加上了virtual修饰符,被称之为虚方法,反之为非虚方法。C#语言的虚方法和C++语言的基本一致。继承机制引出多态机制某一类型的引用变量可以指向该类或者其子类的对象。由于C#中System.Object类是所有类的祖先,所以可以用Object类型的引用指向所有类型的对象多态性是指不同的对象收到相同的消息时,会产生不同动作。C#支持两种类型的多态性:①编译时的多态性是通过重载类实现的,系统在编译时,根据传递的参数个数、类型信息决定实现何种操作。②运行时的多态性是指在运行时,根据实际情况决定实现何种操作。C#中运行时的多态性通过虚函成员实现。(1)虚拟方法和重载方法重载指在同一个类中至少有两个方法用同一个名字,但有不同的参数。重载使得从外部来看,一个操作对于不同的对象有不同的处理方法。调用时,根据参数的不同来区别调用哪个方法。方法的返回类型可以相同或不同,但它不足以使返回类型变成唯一的差异。重载方法的参数表必须不同。动态绑定就是根据对象的类型决定调用哪个方法,而不是引用的类型。类的方法使用virtual关键字修饰后就成为虚方法,包括两个步骤:①对于基类中要实现多态性的方法,用virtual关键字修饰。不允许再有static,abstract或override修饰符。②对于派生类中的同名方法(覆盖)--相同的名称、返回类型和参数表,使用override关键字修饰。不能有new、static或virtual修饰符。(2)抽象类和抽象方法抽象类表示一种抽象的概念,只是希望以它为基类的派生类有共同的函数成员和数据成在一个类前面加上“abstract”关键字,此类就成为了抽象类。对应的,一个方法类前面加上“abstract”关键字,此方法就成为了抽象方法。面向对象程序设计教案chp52014-2015(2)学期-5-员。抽象类使用abstract修饰符,对抽象类的使用有以下几点规定:①抽象类只能作为其它类的基类,它不能直接被实例化。②抽象类允许包含抽象成员,虽然这不是必须的。抽象成员用abstract修饰符修饰。③抽象类不能同时又是密封的。④抽象类的基类也可以是抽象类。如果一个非抽象类的基类是抽象类,则该类必须通过覆盖来实现所有继承而来的抽象方法,包括其抽象基类中的抽象方法,如果该抽象基类从其它抽象类派生,还应包括其它抽象类中的所有抽象方法。注意抽象方法不能有实现代码,在函数名后直接跟一个分号。抽象类专用于派生出子类,子类必须实现抽象类所声明的抽象方法,否则,子类仍是抽象类。抽象类一般用于表达一种比较抽象的事物,例如前面所说的“水果”,而抽象方法则说明此抽象类应该具有的某种性质,例如,Fruit类中有一个抽象方法GrowInArea()说明水果一定有一个最适合其生长的地区,但不同的水果生长地是不同的。从同一抽象类中继承的子类拥有相同的方法(即抽象类所定义的抽象方法),但这些方法的具体代码每个类都可以不一样。可以按照以下公式编写代码:抽象类变量名=new继承自此抽象类的具体子类名();一个抽象类中可以包含非抽象的方法和字段。因此:包含抽象方法的类一定是抽象类,但抽象类中的方法不一定是抽象方法。(3)密封类和密封方法C#允许把类和方法声明为sealed。对于类来说,这表示不能继承该类;对于方法来说,这表示不能重写该方法。在把类或方法标记为sealed时,最可能的情形是:如果要对库、类或自己编写的其他类进行操作,则重写某些功能会导致错误。也可以因商业原因把类或方法标记为sealed,以防第三方以违反注册协议的方式扩展该类。但一般情况下,在把类或方法标记为sealed时要小心,因为这么做会严重限制它的使用。即使不希望它能继承一个类或重写类的某个成员,仍有可能在将来的某个时刻,有人会遇到我们没有预料到的情形。.NET基类库大量使用了密封类,使希望从这些类中派生出自己的类的第三方开发人员无法访问这些类。例如string就是一个密封类。把方法声明为sealed也可以实现类似的目的,但很少这么做。要在方法或属性上使用sealed关键字,必须先在基类上把面向对象程序设计教案chp52014-2015(2)学期-6-它声明为重写。如果基类上不希望有重写的方法或属性,就不要把它声明为virtual。①C#提供一种不能被继承的类,称为密封类。密封类的声明方法是在类名前加上sealed修饰符。修饰符abstract和sealed不能同时使用。还可以在重写基类中的虚方法或虚属性上使用sealed修饰符。这将使您能够允许类从您的类继承,并防止它们重写特定的虚方法或虚属性。在下面的示例中,C从B继承,但C无法重写在A中声明并在B中密封的虚函数F。②有时候,并不希望编写的类被继承。或者有的类已经没有再被继承的必要。C#提出了一个密封类(sealedclass)的概念,帮助开发人员来解决这一问题。密封类在声明中使用sealed修饰符,这样就可以防止该类被其它类继承。如果试图将一个密封类作为其它类的基类,C#编译器将提示出错。理所当然,密封类不能同时又是抽象类,因为抽象总是希望被继承的。③C#还提出了密封方法(sealedmethod)的概念。方法使用sealed修饰符,称该方法是一个密封方法。在派生类中,不能覆盖基类中的密封方法。课堂练习分析案例编译和执行C#程序P5_1,…,P5_6教学总结本次课程的讲授内容是:1.继承;2.多态性。作业1.简述public,protected,private关键字在继承中的作用。2.简述覆盖和重载的区别,以及它们各自的适用场合。3.属性、索引函数和构造函数可否被虚拟和重载?4.试说说图书馆管理系统中可能存在哪些虚拟和重载的情况?预习委托和事件
本文标题:面向对象程序设计-教案chp5-2014-2015学期
链接地址:https://www.777doc.com/doc-1960755 .html