【教学课件】第7章多态性.ppt
《【教学课件】第7章多态性.ppt》由会员分享,可在线阅读,更多相关《【教学课件】第7章多态性.ppt(54页珍藏版)》请在三一办公上搜索。
1、Visual C#程序设计,中原工学院计算机系赵冬,本章目标理解多态性是如何实现系统的可扩展和可维护的理解抽象类具体类之间的差异学会如何创建及使用接口和委托理解事件与委托的关系及如何使用事件使用运算符重载,第7章 多态性,第7章 多态性,多态性一词最早用于生物学,指同一种族的生物体具有相同的特性。在 C#中多态性的定义是同一操作作用于不同的类的实例,不同的类将进行不同的解释,最后产生不同的执行结果。C#支持两种类型的多态性。,编译时的多态性 编译时的多态性通过重载来实现。方法重载和操作符重载都实现了编译时的多态性。对于非虚拟的成员来说系统在编译时根据传递的参数、返回的类型等信息决定实现何种操作
2、。运行时的多态性 运行时的多态性是指直到系统运行时才根据实际情况决定实现何种操作,C#中运行时的多态性通过虚拟成员实现,编译时的多态性为我们提供了运行速度快的特点,而运行时的多态性则带来了高度灵活和抽象的特点。,第7章 多态性,覆盖(隐藏)、虚函数是实现多态的主要方式。虚函数和覆盖区别 a.覆盖,变量类型为子类时调用,编译时决定,用 new 修饰。b.虚函数,由变量引用对象的实际类型决定,运行时决定,基类方法用 virtual 修饰,子类方法用 override 修饰。,第7章 多态性,using System;using System.Windows.Forms;class Apublic
3、void F()Console.WriteLine(A.F);public virtual void G()Console.WriteLine(A.G);class B:Anew public void F()Console.WriteLine(B.F);public override void G()Console.WriteLine(B.G);class Teststatic void Main()B b=new B();A a=b;a.F();/由变量类型决定(变量类型仍为父类类型)b.F();a.G();/由变量引用对象的实际类型决定(子类类型)b.G();,第7章 多态性,运行结果,
4、7.1.1 抽象方法 基类的某些虚拟方法有时不可能被调用到,这时候可定义该虚拟方法为抽象方法。抽象方法没有方法体,但必须声明,它告诉编译器,派生类必须通过重写该方法以提供它们自己的实现。当实例方法包含有 abstract 修饰符时,称该方法为抽象方法。虽然抽象方法同时隐含为虚拟方法,但它不能有 virtual 修饰符。类声明中包含有 abstract 修饰符时,该类为抽象类,抽象类只能是其他类的基类。,7.1 抽象方法与抽象类,如果类中有抽象成员,则必须定义为抽象类,但抽象类可以不包含抽象成员。有抽象方法的基类叫抽象类。由于抽象函数没有定义,抽象类不能有实例。否则,调用实例的这个抽象函数就会出
5、错。抽象类的子类可实际定义抽象函数,这样就可生成实例。抽象函数一定是虚函数,主要用来抽象所有子类,给出子类成员函数的共性,规定成员函数共同的原型。,7.1.1 抽象方法,7.1.1 抽象方法,实例:多态性及实现(1)P169代码分析与讨论(1)shape 类包含:两个具体属性 X 和 Y;一个虚拟方法 Volume;一个抽象方法 Area;一个抽象属性 Name。它们在 shape 类的派生类中会有不同的实现。,(2)抽象方法具有以下特性:抽象方法是隐式的 virtual 方法。只允许在抽象类中使用抽象方法声明。抽象方法声明不提供实现,因此没有方法体,只以一个分号结束。例如:public ab
6、stract double Area();其实现由 override 方法提供。在抽象方法声明中使用 static、virtual 或 ovrride 修饰符是错误的。,(3)若直接基类中提供虚拟方法定义,则其派生类可以不声明与虚拟方法同名的方法,直接引用基类提供的缺省定义。派生类也可以对基类提供的虚拟方法进行重写以代替基类提供的缺省定义(在需要的时候)。如直接基类 Shape 中的虚拟方法 Volume 的定义。(4)若直接基类定义的虚拟方法为抽象方法,则其派生类必须提供虚拟方法的实现。如 Shape 类提供了抽象方法 Area 的定义。,(5)abstract 修饰符除可用于方法外还可用于
7、属性。当属性声明为抽象属性时该属性不包含实现,从抽象类派生的非抽象类必须包括抽象属性的实现。如抽象类 Shape 声明的抽象属性 Name。,类声明中包含有 abstract 修饰符时,该类为抽象类,抽象类只能是其他类的基类。如果类中有抽象成员,则必须定义为抽象类,但抽象类可以不包含抽象成员。实例:多态性及实现(2)P178,7.1.2 抽象类,7.1.2 抽象类,代码分析与讨论(1)除了在声明和调用语法上不同外,抽象属性的行为与抽象方法一样,但要注意:在静态属性上使用 abstract 修饰符是错误的。在派生类中,通过使用 override 修饰符的属性声明可以重写抽象的继承属性。,7.1.
8、2 抽象类,(2)抽象类具有以下特性:抽象类不能实例化。抽象类可以(但不要求)包含抽象方法和抽象访问器。不能用 sealed 修饰符修改抽象类,这意味着该类不能被继承。当从抽象类派生非抽象类时,非抽象类必须包含所有继承抽象成员的具体实现,这样的实现是通过重写抽象成员提供的。,接口用 interface 关键字声明。接口是一个协定,实现接口的类或结构必须遵守其协定。C#中每个类只能继承一个基类,限制了多继承。但通过接口提供多继承模型,接口可以从多个基接口继承,而类或结构也可实现多个接口。,7.2 接口,7.2 接口,接口的成员必须是方法、属性、事件或索引器,但不能包含常数、字段、运算符、实例构造
9、函数、析构函数或类型,也不能包含任何种类的静态成员。接口本身不提供它所定义的成员的实现,它只指定实现该接口的类或结构必须提供的成员,因此接口不能实例化。所有的接口成员都隐式地具有 public 访问权限。,7.2 接口,接口成员声明不能包含任何修饰符。具体地说,接口成员包含下列任何修饰符都属于编译时错误:abstract、public、protected、internal、private、virtual、override 或 static。,定义与类的定义类似,例如:interface IMyInterface/成员的定义 接口标识一般习惯以大写字母 I 开头,7.2 接口,例:interfa
10、ce IExamplestring thisint index get;set;event EventHandler E;void F(int value);string P get;set;,7.2 接口,接口可以继承接口,在派生的接口中如果要隐藏基接口的成员,用关键字 new,而不是 override。例如interface ImyDerivedInterface:IMyInterface new int MyIntProperty get;set;,7.2 接口,实例:薪水发放系统 p180代码分析与讨论(1)接口的方法和属性在类中实现。若实现了方法,返回数据类型和参数数据类型必须完全匹
11、配 interface 块中对该方法的描述(类似于 abstract 类)。(2)接口引用能够为实现接口的每一类型调用方法成员的正确派生版本。不同的对象与其方法关联在一起,因此在调用方法时不必考虑是哪个对象,只要这个对象是接口的引用就行,这也是多态性行为的典型实例。,7.2 接口,7.2 接口,实例:用接口实现不同的度量衡系统 p186代码分析与讨论(1)如果一个类实现的两个接口具有相同的成员名称,且每个成员都需要有不同的实现,就必须采用接口成员的显示实现。接口成员的显示实现是指实现接口的成员时成员名称使用完全限定名。,(2)实现接口的类可正常实现(隐式实现)某些方法,调用时就可以从类实例访问
12、它们,即这些方法是类默认具有的功能;而其它同名方法则需显式实现。显式实现接口成员只能通过接口实例访问,并只能由它的成员名称引用。(3)显式接口成员不能使用任何访问限制符也不能加上 abstract,virtual,override 或static 修饰符。如果一个类支持一接口,则它的所有的派生类自动支持这接口。,7.2 接口,抽象类与接口紧密相关,它们不能实例化,并且常常部分实现或根本不实现。抽象类和接口之间的一个主要差别是:类可以实现无限个接口,但仅能从一个抽象(或任何其他类型)类继承。从抽象类派生的类仍可实现接口。可以在创建组件时使用抽象类,因为它们使您得以在某些方法中指定不变级功能,但直
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 教学课件 教学 课件 多态性

链接地址:https://www.31ppt.com/p-4879286.html