net面向对象程序设计-13-创建接口和定义抽象类-2010-2011-2剖析

上传人:今*** 文档编号:107487483 上传时间:2019-10-19 格式:PPT 页数:40 大小:797KB
返回 下载 相关 举报
net面向对象程序设计-13-创建接口和定义抽象类-2010-2011-2剖析_第1页
第1页 / 共40页
net面向对象程序设计-13-创建接口和定义抽象类-2010-2011-2剖析_第2页
第2页 / 共40页
net面向对象程序设计-13-创建接口和定义抽象类-2010-2011-2剖析_第3页
第3页 / 共40页
net面向对象程序设计-13-创建接口和定义抽象类-2010-2011-2剖析_第4页
第4页 / 共40页
net面向对象程序设计-13-创建接口和定义抽象类-2010-2011-2剖析_第5页
第5页 / 共40页
点击查看更多>>
资源描述

《net面向对象程序设计-13-创建接口和定义抽象类-2010-2011-2剖析》由会员分享,可在线阅读,更多相关《net面向对象程序设计-13-创建接口和定义抽象类-2010-2011-2剖析(40页珍藏版)》请在金锄头文库上搜索。

1、,.NET面向对象程序设计 第13章 创建接口和定义抽象类,本章简介,定义接口 在结构或类中实现接口 通过接口引用一个类 在抽象类中捕获通用的实现细节 使用sealed关键字,13.2 抽象类,存在的问题: MoveForward方法仅仅是一个哑方法,它需要在子类中进行覆盖,如果放置了错误的方法而又有人调用,问题严重!,19: public virtual void MoveForward() 20: 21: Console.Write(“Moving forward. “); 22: odometer += 1; 23: Console.WriteLine(“Odometer reading

2、: 0 “, odometer); 24: ,解决:,使用抽象方法 一个抽象方法只包含方法头而且没有实现代码,它需要后续类来具体实现这一方法。 当一个类包含一个或多个抽象方法时,此类必须声明为abstract。 一个抽象类不能实例化,因为它包含没有实现的方法。,示例:AbstractMoveForward.cs,01: using System; 02: 03: abstract class Car 04: 05: private uint odometer = 0; 06: 07: protected uint Odometer 08: 09: set 10: 11: odometer =

3、value; 12: 13: get 14: 15: return odometer; 16: 17: 18: 19: public abstract void MoveForward(); 20: ,22: class RacingCar : Car 23: 24: public override void MoveForward() 25: 26: Console.Write(“Moving dangerously fast forward. “); 27: Odometer += 30; 28: Console.WriteLine(“Odometer in racing car: 0 “

4、, Odometer); 29: 30: 32: class FamilyCar : Car 33: 34: public override void MoveForward() 35: 36: Console.Write(“Moving slowly but safely forward.“); 37: Odometer += 5; 38: Console.WriteLine(“Odometer in family car: 0 “, Odometer); 39: 40: 42: class CarTester 43: 44: public static void Main() 45: 46

5、: RacingCar myRacingCar = new RacingCar(); 47: FamilyCar myFamilyCar = new FamilyCar(); 48: myRacingCar.MoveForward(); 49: myFamilyCar.MoveForward(); 50: 51: ,Syntax Box : Abstract Method,Abstract_method:= abstract ( ); Abstract_property_1:= abstract get; set; Abstract_indexer_1:= abstract this get;

6、 set; Abstract_class:= abstract ,说明:,用关键字abstract声明的抽象方法没有方法体,在一对包括形式参数列表的圆括号后面有一个分号。 抽象方法不能声明为private、static、virtual 抽象方法和抽象存取器为隐式的virtual 抽象方法只能存在于抽象类中,但抽象类能包括非抽象方法 抽象类不能实例化 从一个包含抽象方法的类中派生一个类,派生类也成为抽象,除非覆盖从基类中继承的所有抽象方法并提供实现语句。 在派生类中可以使用抽象方法来覆盖虚方法,任何从此抽象类派生的类必须覆盖这些抽象方法并提供新的实现语句,使之变成非抽象。,9,生活中的接口,电脑

7、主板上的PCI插槽的规范就类似于C#接口,声卡,显卡,网卡,每种卡的内部结构都不相同,可以把声卡、网卡、显卡都插在PCI插槽上,而不用担心哪个插槽是专门插哪个卡的,主板,13.1 理解接口,关于多重继承的争议 多重继承可以让类拥有多个基类 当两个基类都包含一个信号相同但实现过程不同的方法或属性时发生的情况:moveforward、brandName、odometer,C#禁止多重继承而用另一种语言结构:接口来解决问题。,13.1.1 定义接口,接口是表示一组函数成员而不实现成员的引用类型 C#中 使用interface定义接口 注意:C#中建议接口名以大写字母I开头,13.1.2实现接口,要实

8、现一个接口,需要声明一个类或结构,让它们从接口继承,并实现接口指定的全部方法,例如: interface ILandBound int NumberOfLegs(); ,然后可以在Horse类中实现该接口,class Horse : ILandBound . public int NumberOfLegs() return 4; ,实现一个接口时,必须保证每个方法都完全匹配与它对应的接口中的方法,规则如下: 方法名和返回类型完全匹配 所有参数(包括ref和out关键字)完全匹配 使用接口名作为方法的前缀,称之为显式接口实现,尽量使用显式接口实现 用于实现一个接口的所有方法都必须具有public

9、可访问性,但是,如果使用显式接口实现,则不应该为方法添加访问修饰符 接口的定义和实现存在任何差异,类都无法编译,一个类可以在扩展另一个类的同时实现一个接口 下例将Horse定义成从Mammal继承的一个类,同时实现了ILandBound接口 interface ILandBound . class Mammal . class Horse : Mammal , ILandBound . ,13.1.3 通过接口来引用一个类,可以把一个变量定义成引用层次结构中较高位置的一个类,然后用这个变量引用对象 类似的,可以将一个变量定义成类所实现的接口,然后用这个变量引用对象 例如: Horse myHo

10、rse = new Horse(.); ILandBound iMyHorse = myHorse; / legal 通过接口来引用一个对象,是一项相当有用的技术 我们能由此定义方法,让它获得不同的类型作为参数,只要类型实现了指定的接口,int FindLandSpeed(ILandBound landBoundMammal) . ,13.1.4 使用多个接口,一个类最多只能有一个基类,但可以实现数量无限的接口 类必须实现它从它的所有接口继承的所有方法 例如: class Horse : Mammal, ILandBound, IGrazable . ,13.1.5 显式实现接口,Horse类

11、实现了ILandBound接口,但在Horse的NumberOfLegs方法中,没有任何地方说它是ILandBound接口的一部分 interface ILandBound int NumberOfLegs(); class Horse : ILandBound . public int NumberOfLegs() return 4; ,如果Horse类实现了多个接口,而多个接口指定了同名的方法,则会出现歧义 例如: interface IJourney int NumberOfLegs(); class Horse : ILandBound, IJourney . public int N

12、umberOfLegs() return 4; ,C#中通过显式实现接口解决这个问题 为此,要在实现一个接口时,指明方法从属于该接口 class Horse : ILandBound, IJourney . int ILandBound.NumberOfLegs() return 4; int IJourney.NumberOfLegs() return 3; ,注意:方法没有用public标记。如果方法是显式接口实现的一部分,就不能为方法指定访问修饰符,所以无法从类的外部访问。,如果方法在Horse类中可见,下述代码无法确定 Horse horse = new Horse(); . int

13、legs = horse.NumberOfLegs(); 应该通过恰当的接口来引用Horse对象 Horse horse = new Horse(); . IJourney journeyHorse = horse; int legsInJourney = journeyHorse.NumberOfLegs(); ILandBound landBoundHorse = horse; int legsOnHorse = landBoundHorse.NumberOfLegs();,abstract class与interface,抽象类(abstract class)是一种特殊的类 抽象方法只做

14、声明,而不包含实现,可以看成是没有实现体的虚方法 抽象类不能被实例化,除此之外,具有类的其他特性 抽象类可以但不是必须有抽象属性和抽象方法,但是一旦有了抽象方法,就一定要把这个类声明为抽象类 具体派生类必须覆盖基类的抽象方法 抽象类可以派生自另一个抽象类,可以覆盖基类的抽象方法也可以不覆盖,如果不覆盖,则其派生类必须覆盖它们,接口:是引用类型,类似于抽象类但又不同于抽象类 不能被实例化 只能包含实现的方法声明 成员可以包括方法、属性、索引器和事件 接口中不能包含常量、字段、构造函数、析构函数或静态成员 接口中的所有成员默认为public,接口中不能有private成员 派生类必须实现接口的所有

15、成员 一个类可以实现多个接口 一个接口可以有多个父接口,实现该接口必须实现多有父接口中的所有成员,抽象类和接口的共同点,都可以被继承 都不能被实例化 都可以包含方法声明 派生类必须实现未实现的方法,抽象类和接口的区别,抽象类是一个不完整的类,需要进一步细化,而接口只是一个行为规范或规定,微软的自定义接口总是后带able字段,证明其是表述一类类“我能做”. 抽象类可以定义字段、属性和方法实现。接口只能定义属性、索引器、事件、和方法声明,不能包含字段。 抽象类更多的是定义在一系列紧密相关的类之间,而接口大多数是定义在关系疏松但都实现某一功能的类中。 接口基本上不具备继承的任何具体特点,它仅仅承诺了能够调用的方法。 接口可以被多重实现,抽象类只能被单一继承。即一个类一次可以实现若干个接口,但只能继承一个父类。 接口可以用于支持回调,而继承并不具备这个特点。 抽象类不能被密封。 抽象类实现的具体方法默认为虚的,但实现接口类的接口方法却默认为非虚的,当然也可以声明为虚的。 接口与非抽象类类似,抽象类也必须为在该类的基类表中列出接口的所有成员提供它自己的实现。但是,允许抽象类将接口方法映射到抽象方法上。 如果抽象类实现接口,则

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 高等教育 > 大学课件

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号