C#-继承和接口ppt课件.ppt
经营者提供商品或者服务有欺诈行为的,应当按照消费者的要求增加赔偿其受到的损失,增加赔偿的金额为消费者购买商品的价款或接受服务的费用第第7章章 继承和接口继承和接口经营者提供商品或者服务有欺诈行为的,应当按照消费者的要求增加赔偿其受到的损失,增加赔偿的金额为消费者购买商品的价款或接受服务的费用内容提要:内容提要:C#的继承机制的继承机制 派生类的构造与析构派生类的构造与析构 多态性多态性 继承和接口的用法继承和接口的用法目的要求:目的要求:掌握继承和接口的声明及调用掌握继承和接口的声明及调用重点难点:重点难点:继承、接口继承、接口经营者提供商品或者服务有欺诈行为的,应当按照消费者的要求增加赔偿其受到的损失,增加赔偿的金额为消费者购买商品的价款或接受服务的费用7.1 C#的继承机制的继承机制 继承使面向对象技术能够提高软件开发效率继承使面向对象技术能够提高软件开发效率的重要原因之一,其定义是:特殊类的对象拥有的重要原因之一,其定义是:特殊类的对象拥有其一般类的全部属性与服务,称作特殊类对一般其一般类的全部属性与服务,称作特殊类对一般类的继承。类的继承。经营者提供商品或者服务有欺诈行为的,应当按照消费者的要求增加赔偿其受到的损失,增加赔偿的金额为消费者购买商品的价款或接受服务的费用 7.1.1 继承的基本知识继承的基本知识 继承继承(Inheritance)是自动地共享类、派生类和对是自动地共享类、派生类和对象中的方法和数据的机制。它允许在既有类的基础象中的方法和数据的机制。它允许在既有类的基础上创建新类,新类从既有类中继承类成员,而且可上创建新类,新类从既有类中继承类成员,而且可以重新定义或加进新的成员,从而形成类的层次或以重新定义或加进新的成员,从而形成类的层次或等级。一般称被继承的类为基类或父类,而继承后等级。一般称被继承的类为基类或父类,而继承后产生的类为派生类或子类。产生的类为派生类或子类。经营者提供商品或者服务有欺诈行为的,应当按照消费者的要求增加赔偿其受到的损失,增加赔偿的金额为消费者购买商品的价款或接受服务的费用 类之间的继承关系的存在,对于在实际系统的开类之间的继承关系的存在,对于在实际系统的开发中迅速建立原型,提高系统的可重用性和可扩充性,发中迅速建立原型,提高系统的可重用性和可扩充性,具有十分重要的意义。具有十分重要的意义。派生类的声明格式为:派生类的声明格式为:属性属性 类修饰符类修饰符 class class 类名类名 :基类:基类 类体类体 在类声明中,通过在类名的后面加上冒号和基类在类声明中,通过在类名的后面加上冒号和基类名表示继承。名表示继承。经营者提供商品或者服务有欺诈行为的,应当按照消费者的要求增加赔偿其受到的损失,增加赔偿的金额为消费者购买商品的价款或接受服务的费用 例:例:using System;class Employee public string EmpID;public string EmpName;class Sales:Employee public int 销售额销售额;class Test static void Main()Sales s1=new Sales();s1.EmpID=001;s1.EmpName=张三张三;s1.销售额销售额=100;Console.WriteLine(员工一:员工一:);Console.WriteLine(代号代号=0,名称名称=1,销售额销售额=2,s1.ID,s1.Name,s1.销售额销售额);运行结果如下:运行结果如下:经营者提供商品或者服务有欺诈行为的,应当按照消费者的要求增加赔偿其受到的损失,增加赔偿的金额为消费者购买商品的价款或接受服务的费用 7.1.2 base关键字关键字 base关键字用于从派生类中访问基类的成关键字用于从派生类中访问基类的成员,它有两种基本用法:员,它有两种基本用法:指定创建派生类实例时应调用的基类构造指定创建派生类实例时应调用的基类构造 函数,用于调用基类的构造函数完成对基类函数,用于调用基类的构造函数完成对基类 成员的初始化工作;成员的初始化工作;在派生类中访问基类成员。在派生类中访问基类成员。经营者提供商品或者服务有欺诈行为的,应当按照消费者的要求增加赔偿其受到的损失,增加赔偿的金额为消费者购买商品的价款或接受服务的费用 例:例:using System;class Employee private double bsalary=1000;double psalary;public int n;public double Esalary()Console.Write(该员工进公司的年数为:该员工进公司的年数为:);n=int.Parse(Console.ReadLine();psalary=bsalary*(Math.Pow(1+0.15),(n-1);return psalary;class DEmp:Employee new public double Esalary()Console.WriteLine(计算大专生员工的工资计算大专生员工的工资);return 1.5*base.Esalary();class Test static void Main()DEmp dz=new DEmp();Console.WriteLine(该员工的实际工资为:该员工的实际工资为:0,dz.Esalary();经营者提供商品或者服务有欺诈行为的,应当按照消费者的要求增加赔偿其受到的损失,增加赔偿的金额为消费者购买商品的价款或接受服务的费用7.1.3 覆盖覆盖 当一个实例方法声明包含一个当一个实例方法声明包含一个override限定符限定符 时,这个方法就用相同的属性覆盖一个被继承的时,这个方法就用相同的属性覆盖一个被继承的 虚拟方法,则此方法被称为覆盖方法。覆盖方法虚拟方法,则此方法被称为覆盖方法。覆盖方法 声明不能包括声明不能包括new,static,virtual或或abstract限定限定 符中的任何一个,对于一个覆盖声明,除非下面符中的任何一个,对于一个覆盖声明,除非下面 都是可行的,否则,编译时就会出错:都是可行的,否则,编译时就会出错:经营者提供商品或者服务有欺诈行为的,应当按照消费者的要求增加赔偿其受到的损失,增加赔偿的金额为消费者购买商品的价款或接受服务的费用 一个被覆盖的基本方法能被定位;一个被覆盖的基本方法能被定位;被覆盖的基本方法是虚拟的、抽象的方法,既被被覆盖的基本方法是虚拟的、抽象的方法,既被 覆盖的基本方法不能是静态的或非虚拟的;覆盖的基本方法不能是静态的或非虚拟的;覆盖声明及被覆盖的基本方法具有相同的声覆盖声明及被覆盖的基本方法具有相同的声明访明访 问性。问性。一个覆盖声明访问被覆盖的基本方法。一个覆盖声明访问被覆盖的基本方法。经营者提供商品或者服务有欺诈行为的,应当按照消费者的要求增加赔偿其受到的损失,增加赔偿的金额为消费者购买商品的价款或接受服务的费用7.2 多态性多态性 面向对象的程序设计语言中,多态性是第三种最基面向对象的程序设计语言中,多态性是第三种最基本的特征(前两种是封装和继承)。多态性本的特征(前两种是封装和继承)。多态性(polymorphism来自希腊语,意思是多种形态)是指允许来自希腊语,意思是多种形态)是指允许一个接口访问动作的通用类的性质。一个接口访问动作的通用类的性质。7.2.1 多态性概述多态性概述 多态性是指在一般类中定义的属性或行为,被特殊多态性是指在一般类中定义的属性或行为,被特殊类继承之后,可以具有不同数据类型或表现出不同的行为。类继承之后,可以具有不同数据类型或表现出不同的行为。这使得同一个属性或行为在一般类及其各个特殊类中具有这使得同一个属性或行为在一般类及其各个特殊类中具有不同的语义。不同的语义。经营者提供商品或者服务有欺诈行为的,应当按照消费者的要求增加赔偿其受到的损失,增加赔偿的金额为消费者购买商品的价款或接受服务的费用7.2.2 虚方法虚方法 当方法声明中包含virtual修饰符时,方法就被称为虚方法。当没有virtual修饰符时,方法被称为非虚方法,虚方法定义中不能包含static、abstract或override修饰符。非虚方法的执行是不变的,不管方法在从它声明的类的实例中还是在派生类中的实例中被调用,执行都是相同的。相反,虚方法的执行可以被派生类改变,具体实现是在派生类中重新定义此虚方法实现的。重新定义此虚方法时,要求方法名称、返回值类型、参数表中的参数个数、类型顺序都必须与基类中的虚方法完全一致,而且要在方法声明中加上override关键字,不能有new,static或virtual修饰符。经营者提供商品或者服务有欺诈行为的,应当按照消费者的要求增加赔偿其受到的损失,增加赔偿的金额为消费者购买商品的价款或接受服务的费用 7.3 接口接口 接口是用来描述组件对外提供的服务,并在组接口是用来描述组件对外提供的服务,并在组件和组件之间,组件和客户之间定义交互的标准。件和组件之间,组件和客户之间定义交互的标准。组件一旦发布,它只能通过预先定义的接口来提供组件一旦发布,它只能通过预先定义的接口来提供合理的,一致的服务,这种接口定义之间的稳定性合理的,一致的服务,这种接口定义之间的稳定性使客户应用开发者能够构造出坚固的应用。使客户应用开发者能够构造出坚固的应用。经营者提供商品或者服务有欺诈行为的,应当按照消费者的要求增加赔偿其受到的损失,增加赔偿的金额为消费者购买商品的价款或接受服务的费用7.3.1 接口的定义接口的定义 1.声明声明 一个接口定义了一个协议。一个实现了某个接口的类或结构一个接口定义了一个协议。一个实现了某个接口的类或结构必须符合它的协议。一个接口可以从多个基本接口继承,而一个必须符合它的协议。一个接口可以从多个基本接口继承,而一个类或结构也可以实现多个接口。类或结构也可以实现多个接口。接接口口可可以以包包含含方方法法、属属性性和和索索引引等等(即即在在接接口口中中只只能能包包含含方方法法而而不不能能包包含含变变量量)。接接口口自自己己不不为为它它所所定定义义的的成成员员提提供供具具体体实实现现。接口只是指定类中必须被实现的成员。接口只是指定类中必须被实现的成员。格式:格式:接口修饰符接口修饰符 interface 接口名接口名:基接口名:基接口名 接口的成员;接口的成员;;经营者提供商品或者服务有欺诈行为的,应当按照消费者的要求增加赔偿其受到的损失,增加赔偿的金额为消费者购买商品的价款或接受服务的费用2.接口的继承接口的继承 接口具有不变性,但这并不意味着接口不再发展。接口具有不变性,但这并不意味着接口不再发展。类似于类的继承性,接口也可以继承和发展。类似于类的继承性,接口也可以继承和发展。接口可以从零或多个接口中继承。从多个接口中接口可以从零或多个接口中继承。从多个接口中继承时,用继承时,用“:”后跟被继承的接口名字。多个接后跟被继承的接口名字。多个接口名之间用口名之间用“,”分割。被继承的接口应该是可以分割。被继承的接口应该是可以访问到的,即不能从访问到的,即不能从private或或internal类型的接口类型的接口继承,接口还不允许直接或间接地从自身继承。继承,接口还不允许直接或间接地从自身继承。经营者提供商品或者服务有欺诈行为的,应当按照消费者的要求增加赔偿其受到的损失,增加赔偿的金额为消费者购买商品的价款或接受服务的费用例:例:using System;interface IControl void Paint();interface ITextBox:IControl void SetText(string text);interface IListBox:IControl void SetItems(string items);interface IComboBox:ITextBox,IListBox 对一个接口的继承也就继承了接口的所有成员。上例中,接口对一个接口的继承也就继承了接口的所有成员。上例中,接口ITextBox和和IListBox都从接口都从接口IControl中继承的,也就继承了接口中继承的,也就继承了接口IControl的的Paint方法。方法。IComboBox的基本接口是的基本接口是IControl、ITextBox,和和IListBox。即上面的接口。即上面的接口IComboBox继承了接口继承了接口IControl的的Paint方法、方法、ITextBox的的SetText方法和方法和IListBox的的SetItems方法。方法。经营者提供商品或者服务有欺诈行为的,应当按照消费者的要求增加赔偿其受到的损失,增加赔偿的金额为消费者购买商品的价款或接受服务的费用7.3.2 接口的成员接口的成员1.接口成员的定义接口成员的定义 接接口口可可以以包包含含一一个个或或多多个个成成员员,这这些些成成员员可可以以是是方方法法、属属性性等等,但但不不能能是是常常量量、运运算算符符、构构造造函函数数或或析析构构函函数数,而而且不能包含任何静态成员。且不能包含任何静态成员。例:例:public interface ImyList void Add(string s);int Count get;所所有有接接口口成成员员默默认认都都是是公公有有访访问问(即即隐隐式式地地具具有有publicpublic访问权限)。访问权限)。经营者提供商品或者服务有欺诈行为的,应当按照消费者的要求增加赔偿其受到的损失,增加赔偿的金额为消费者购买商品的价款或接受服务的费用2.接口属性接口属性 接口属性用接口属性声明来声明:接口属性用接口属性声明来声明:接口属性修饰符接口属性修饰符 接口属性类型接口属性类型 接口属性标识接口属性标识 接口属性访问器;接口属性访问器;接口属性声明的访问器与类属性声明的访问器的接口属性声明的访问器与类属性声明的访问器的用法相同。用法相同。其中,访问器可以为:其中,访问器可以为:get;set;get;set;set;get;即接口的属性可以是只读、只写或可读可写的。即接口的属性可以是只读、只写或可读可写的。经营者提供商品或者服务有欺诈行为的,应当按照消费者的要求增加赔偿其受到的损失,增加赔偿的金额为消费者购买商品的价款或接受服务的费用3.接口事件接口事件接口事件用接口事件声明来声明:接口事件用接口事件声明来声明:接口事件修饰符接口事件修饰符 new event 类型名类型名 接口事件标识符;接口事件标识符;接口事件声明了一个事件。实现接口事件的类可以通接口事件声明了一个事件。实现接口事件的类可以通过事件与其他类进行交流。过事件与其他类进行交流。经营者提供商品或者服务有欺诈行为的,应当按照消费者的要求增加赔偿其受到的损失,增加赔偿的金额为消费者购买商品的价款或接受服务的费用4.接口索引接口索引接口索引使用接口索引声明来声明:接口索引使用接口索引声明来声明:接口索引修饰符接口索引修饰符 new 类型名类型名 this 参数列表参数列表 接口访问器接口访问器;接口索引声明中的属性、类型和形式参数列表与类的索引声接口索引声明中的属性、类型和形式参数列表与类的索引声明的那些有相同的意义。明的那些有相同的意义。接口索引声明的访问器与类索引声明的访问器相对应,可为:接口索引声明的访问器与类索引声明的访问器相对应,可为:get;set;get;set;set;get;即接口的索引可以是只读、只写或可读可写的。即接口的索引可以是只读、只写或可读可写的。经营者提供商品或者服务有欺诈行为的,应当按照消费者的要求增加赔偿其受到的损失,增加赔偿的金额为消费者购买商品的价款或接受服务的费用5.对接口成员的访问对接口成员的访问 接口方法的调用和采用索引指示器访问的接口方法的调用和采用索引指示器访问的规规则与类的情况也是相同的,如果底层成员的命则与类的情况也是相同的,如果底层成员的命名名与继承而来的高层成员一致,那么底层成员将与继承而来的高层成员一致,那么底层成员将覆覆盖同名的高层成员。但是接口是支持多继承的,盖同名的高层成员。但是接口是支持多继承的,这样在多继承中如果两个父接口含有同名的成这样在多继承中如果两个父接口含有同名的成员员就会产生二义性。这时就需要进行显式的声明。就会产生二义性。这时就需要进行显式的声明。经营者提供商品或者服务有欺诈行为的,应当按照消费者的要求增加赔偿其受到的损失,增加赔偿的金额为消费者购买商品的价款或接受服务的费用6.接口成员的完全有效名称接口成员的完全有效名称 使用接口成员也可采用其使用接口成员也可采用其“完全有效名称完全有效名称”(fully qualified name)。它是这样构成的,接口名加句点)。它是这样构成的,接口名加句点“.”,再跟成员名。,再跟成员名。经营者提供商品或者服务有欺诈行为的,应当按照消费者的要求增加赔偿其受到的损失,增加赔偿的金额为消费者购买商品的价款或接受服务的费用7.3.3 接口的实现接口的实现 接口的声明仅仅给出了抽象方法,相当于程序开发早期的一组接口的声明仅仅给出了抽象方法,相当于程序开发早期的一组协议。具体地实现接口所规定的功能,则需某个类为接口中的抽象协议。具体地实现接口所规定的功能,则需某个类为接口中的抽象方法定义实在的方法体(即语句),称为实现这个接口。方法定义实在的方法体(即语句),称为实现这个接口。1.在类中实现接口在类中实现接口 接接口口可可以以通通过过类类或或结结构构来来实实现现,其其实实现现方方法法都都是是类类似似的的。用用类类来实现接口时,接口的名称必须包含在类声明中的基类列表中。来实现接口时,接口的名称必须包含在类声明中的基类列表中。例如:例如:class Myclass:IMyInterface1,IMyInterface2 /实现接口中声明的成员实现接口中声明的成员 经营者提供商品或者服务有欺诈行为的,应当按照消费者的要求增加赔偿其受到的损失,增加赔偿的金额为消费者购买商品的价款或接受服务的费用实现某个接口的类必须要同时实现该接口的基接口的所有成员。实现某个接口的类必须要同时实现该接口的基接口的所有成员。例如:例如:using System;interface ISequence object Add();interface IRing:ISequence int Insert(object obj);class RingSequence:IRing public object Add().public int Insert(object obj).类类 RingSequence除除了了要要实实现现接接口口IRing中中的的方方法法Insert外外,还还必必须须同同时实现接口时实现接口IRing基接口基接口 ISequence中的方法中的方法Add。经营者提供商品或者服务有欺诈行为的,应当按照消费者的要求增加赔偿其受到的损失,增加赔偿的金额为消费者购买商品的价款或接受服务的费用一个类还可以实现多个接口,例如:一个类还可以实现多个接口,例如:using System;interface IControl void Paint();interface IDataBound void Bind(int b);public class Control:IControl public void Paint().public class EditBox:Control,IControl,IDataBound public void Paint().public void Bind(int b).上上 例例 中中,类类 EditBox从从 Control类类 继继 承承,并并 同同 时时 实实 现现 了了Icontrol和和 IdataBound接接 口口。EditBox中中 的的 Paint方方 法法 来来 自自Icontrol,Bind方法来自方法来自IdataBound接口。接口。经营者提供商品或者服务有欺诈行为的,应当按照消费者的要求增加赔偿其受到的损失,增加赔偿的金额为消费者购买商品的价款或接受服务的费用 2.显显式接口成员执行体接口成员执行体 在在某某些些情情况况下下,类类可可能能会会使使用用完完全全有有效效名名称称来来声声明明接接口口成成员的实现,以这种方式实现的接口成员称为显式接口成员。员的实现,以这种方式实现的接口成员称为显式接口成员。例例:public class EditBox:Icontrol,IComparable void Icontrol.Paint()void IComparable.CompareTo(int b).上面的代码中上面的代码中Icontrol.Paint和和I Icomparable.CompareTo就是就是显式接口成员执行体。显式接口成员执行体。经营者提供商品或者服务有欺诈行为的,应当按照消费者的要求增加赔偿其受到的损失,增加赔偿的金额为消费者购买商品的价款或接受服务的费用例:例:using System interface ICloneable object Clone();interface IComparable int CompareTo(object other);class ListEntry:ICloneable,IComparable object ICloneable.Clone().int IComparable.CompareTo(object other).上面的代码中上面的代码中Icloneable.Clone和和comparable.CompareTo就是显式接口成员执行体。就是显式接口成员执行体。显式接口成员执行体不能使用任何访问修饰符,即不能显式接口成员执行体不能使用任何访问修饰符,即不能加加public等修饰符。等修饰符。经营者提供商品或者服务有欺诈行为的,应当按照消费者的要求增加赔偿其受到的损失,增加赔偿的金额为消费者购买商品的价款或接受服务的费用 之之所所以以使使用用显显示示接接口口成成员员执执行行体体,是是因因为为在在某某些些情情况况下下不不适适合合直直接接使使用接口成员的名称。用接口成员的名称。例例:using System;interface Runner void swim();interface Swimmer void swim();class Person:Runner,Swimmer void Runner.swim()Console.WriteLine(run);void Swimmer.swim()Console.WriteLine(swim);class TestInterface static void Main()Person p=new Person();/这时就不能使用这时就不能使用p.swim()Runner r=p;r.swim();Swimmer s=p;s.swim();注注意意:当当接接口口成成员员使使用用显显示示接接口口成成员员执执行行体体方方式式来来实实现现时时,只只能能通通过过接接口实例来访问。口实例来访问。运行结果是:运行结果是:经营者提供商品或者服务有欺诈行为的,应当按照消费者的要求增加赔偿其受到的损失,增加赔偿的金额为消费者购买商品的价款或接受服务的费用 3.接口映射接口映射 类类必必须须为为在在基基类类列列表表中中列列出出的的所所有有接接口口的的成成员员提提供供具具体体的的实实现现,在在类类中中定定位位接接口口成成员员的的实实现现称之为接口映射。称之为接口映射。接接口口通通过过类类实实现现,那那么么对对于于在在一一个个接接口口中中声声明明的的每每一一个个成成员员都都应应该该对对应应着着类类的的一一个个成成员员。这这种对应关系就由接口映射来实现。种对应关系就由接口映射来实现。经营者提供商品或者服务有欺诈行为的,应当按照消费者的要求增加赔偿其受到的损失,增加赔偿的金额为消费者购买商品的价款或接受服务的费用 如如果果一一个个类类继继承承了了两两个个或或两两个个以以上上名名称称和和参参数数类类型型都都相相同同的的接接口口成成员员,那那么么类类中中的的一一个个成成员员就就可可能能实实现现所所有这些接口成员:有这些接口成员:interface IControl void Paint();interface IForm void Paint();class Page:IControl,IForm public void Paint().这这里里接接口口Icontrol和和Iform的的方方法法Paint都都映映射射到到了了类类Page中的中的Paint方法。方法。经营者提供商品或者服务有欺诈行为的,应当按照消费者的要求增加赔偿其受到的损失,增加赔偿的金额为消费者购买商品的价款或接受服务的费用当然也可以分别用显式的接口成员分别实现这两个方法:当然也可以分别用显式的接口成员分别实现这两个方法:using System;interface IControl void Paint();interface IForm void Paint();class Page:IControl,IForm void IControl.Paint()Console.WriteLine(Welcome);void IForm.Paint()Console.WriteLine(How are you!);class test static void Main()Page c=new Page();IControl a=c;a.Paint();IForm b=c;b.Paint();程序运行的结果是:程序运行的结果是:经营者提供商品或者服务有欺诈行为的,应当按照消费者的要求增加赔偿其受到的损失,增加赔偿的金额为消费者购买商品的价款或接受服务的费用4.接口实现的继承机制接口实现的继承机制 一个类继承会实现其基类提供的所有接口,如果不显一个类继承会实现其基类提供的所有接口,如果不显式地重新实现接口,派生类就无法改变从基类中继承而来的式地重新实现接口,派生类就无法改变从基类中继承而来的接口映射。接口映射。5.接口的重实现接口的重实现 派生类可以对基类中已经定义的成员方法进行重载,派生类可以对基类中已经定义的成员方法进行重载,同样,类似的概念在类对接口的实现中叫做接口的重实现。同样,类似的概念在类对接口的实现中叫做接口的重实现。继继承了接口实现的类可以对接口进行重实现,这个接口要求承了接口实现的类可以对接口进行重实现,这个接口要求是是在类声明的基类列表中出现过的,对接口的重实现也必须在类声明的基类列表中出现过的,对接口的重实现也必须严严格的遵守首次思想接口的规则。派生的接口映射不会对接格的遵守首次思想接口的规则。派生的接口映射不会对接口口的重实现所建立的接口映射产生任何影响。的重实现所建立的接口映射产生任何影响。经营者提供商品或者服务有欺诈行为的,应当按照消费者的要求增加赔偿其受到的损失,增加赔偿的金额为消费者购买商品的价款或接受服务的费用6.抽象类与接口抽象类与接口 和非抽象类一样,抽象类也必须提供在基类列表中出和非抽象类一样,抽象类也必须提供在基类列表中出现的所有接口成员的实现。不同的是抽象类允许将接口的方现的所有接口成员的实现。不同的是抽象类允许将接口的方法映射到抽象的成员方法。法映射到抽象的成员方法。经营者提供商品或者服务有欺诈行为的,应当按照消费者的要求增加赔偿其受到的损失,增加赔偿的金额为消费者购买商品的价款或接受服务的费用本章作业:本章作业:1.习题习题7的的113。实验报告:实验报告:实验六实验六