




已阅读5页,还剩2页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
接口: 是隐式公共方法和属性组合起来,以封装特定功能的一个集合。接口不能单独存在,不能像实例化一个类那样实例化接口,但可以建立接口类型的变量。接口不能外含执行其成员的任何代码,而只能定义成员本身,执行过程必须在执行接口的类中实现。abstract和sealed不能在接口中使用,因为这两个修饰符在接口中定义是没有意义的(它们不包含执行代码,所以不能直接实例化,且必须是可以继承的)。接口成员都是公共的。接口没有指定属性应如何存储,所以不能有域。最后,接口与类一样,可以定义为类的成员(但与接口的其他成员不同,因为接口不能包含类型定义) 执行接口的类必须包含该接口所有成员的执行代码,且必须匹配指定的签名(包括匹配指定的get和set块)。可以使用virtual或abstract来执行接口成员,但不能用static或const。接口中添加属性 string Name get; set; -抽象类: 抽象类可以有抽象成员(没有代码体,且必须在派生类中执行,否则派生类本身必须也是抽象的)和非抽象成员(有代码体,也可以是虚拟的,这样可以在派生类中重写)。抽象的方法可以理解为没有方法体的虚函数。-接口和抽象的区别: 接口成员被定义为公共的,因为它们倾向于外部使用,但抽象类的成员也可以是私有的(只要它们不是抽象的)、受保护的、内部的或受保护的内部成员(其中受保护的内部成员只能在应用程序的代码或派生类中访问)。此外,接口不能包含字段、构造函数、析构函数、静态成员或常量。 抽象类主要用作对象系列的基类,共享某些主要特性。接口则主要由类来使用,其中这些类在基础水平上有所不同,但仍可以完成某些相同的任务。 抽象类用于特性,接口用于功能。-继承: 被继承(也称为派生)的类称为父类(也称为基类)。C#中的对象仅能派生于一个基类。只有派生类才能访问一个protected成员。派生类可以提供成员的其它执行代码。这种执行代码不会删除原来的代码,仍可以在类中访问原来的代码,但外部代码不能访问它们。如果没有提供其它执行方式,外部代码就访问基类中成员的执行代码。 注意:虚拟成员不能是私有成员。基类还可以定义为抽象类,抽象类不能直接实例化,要使用抽象类,必须继承这个类。类可以是密封(sealed)的,密封的类不能用作基类,所以也没有派生类。接口也可以派生于其它接口,与类不同的是,接口可以派生多个基接口(以类可以支持多个接口的方式派生)。编译器不允许派生类的可访问性比基类更高,也就是说,内部类可以继承一个公共类,但公共类不能继承一个内部类-多态性: 可以把某个基本类型的变量赋予其派生类型的变量。例Animal myAnimal=myCow;/基本类型=派生类型变量然后就可以通过这个变量调用基类的方法,myAnimal.EatFood(),结果是调用派生类中的EatFood()执行代码。注意,不能以相同的方式调用派生类上定义的方法,因为它是基类型变量。但是,可以基本类型的变量转换为派生类变量,调用派生类的方法。Cow myNewCow=(Cow)myAnimal;/把基本类型变量转换为派生类变量myNewCow.Moo();/调用派生类方法接口=派生类,则调用派生类方法,但不可调用未在接口中定义的方法,除非转换 派生类对象=(派生类)接口抽象类因为有些实体代码,所在在派生类中要么未定义,要么虚(virtual,虚的话,派生类中必须override,这种情况称为重写,重写则将替换基类和派生类的代码,但在派生类的代码中仍可以用base引用基类),要么定义过(定义过的话,派生类如果要new,则必须加new关键字,这种情况称为隐藏,隐藏的话仍可以通过基类来访问)重写类与隐藏类:隐藏仍可以通过基类来访问,使用new来定义它们。隐藏是覆盖,但仍可以通过将其转换成基类型,引用基类型的方法。new重写是实现了隐藏。重写则将替换基类和派生类的代码,重写是删除,除了在派生类的代码中可以用base引用基类,别的地方都不能。virtual/override是重写。C#中,函数默认情况不是虚拟的,但可以明确声明是虚拟的(构造函数除外)。如果基类函数没有声明为virtual,继承类中要使用与基类签名相同的方法,必须用new关键字声明,否则编译时会有警告(最终效果没区别),都是将基类方法隐藏。如果基类函数声明为virtual,继承类要使用与基类签名相同的方法,必须用override关键字声明,这就是所谓的重写。方法的隐藏与重写的区别在于:隐藏,调用的方法取决于引用类型。重写,总是调用派生类的方法。A类-B类B类隐藏A类的方法1B类重写A类的方法2对于方法1时,你用A类去引用时,结果是A类代码,用B类去引用就是B类代码方法2,你用什么类型去引用都是B类的代码接口继承时,因为接口都是无实体的代码,所以不管怎么样,调用的都是派生类的代码。-引用类型和值类型: 值类型:在内存的一个地方(堆栈)存储它们自己和它们的内容,一般存储在堆栈中(但如果值类型在引用类型中声明为字段,它们就内联在堆中)。 引用类型:在内存的一个地方(堆)存储一个引用,而在另一个地方存储内容,存储在名为托管堆的内存区域中。结构类型和类的关键区别是,结构类型是值类型。什么是接口?其实,接口简单理解就是一种约定,使得实现接口的类或结构在形式上保持一致。个人觉得,使用接口可以使程序更加清晰和条理化,这就是接口的好处,但并不是所有的编程语言都支持接口,C#是支持接口的。注意,虽然在概念上,C#接口类似于COM接口,但他们的底层结构是不同的。那么,我们来看一下如何声明和使用接口。声明接口声明接口在语法上和声明抽象类完全相同,例如这里有一个银行账户的接口: publicinterfaceIBankAccountvoidPayIn(decimalamount);boolWithdraw(decimalamount);decimalBalanceget;注意:接口中只能包含方法、属性、索引器和事件的声明。不允许声明成员上的修饰符,即使是pubilc都不行,因为接口成员总是公有的,也不能声明为虚拟和静态的。如果需要修饰符,最好让实现类来声明。使用接口的例子这是书上的一个简单的例子,但足以说明接口的使用方法。一个银行账户的接口,两个不同银行账户的实现类,都继承于这个接口。接口声明如上。下面是两个账户类:classSaverAccount:IBankAccountprivatedecimalbalance;publicdecimalBalancegetreturnbalance;publicvoidPayIn(decimalamount)balance+=amount;publicboolWithdraw(decimalamount)if(balance=amount)balance-=amount;returntrue;Console.WriteLine(Withdrawfailed.);returnfalse;publicoverridestringToString()returnString.Format(VenusBankSaver:Balance=0,6:C,balance);classGoldAccount:IBankAccountprivatedecimalbalance;publicdecimalBalancegetreturnbalance;publicvoidPayIn(decimalamount)balance+=amount;publicboolWithdraw(decimalamount)if(balance=amount)balance-=amount;returntrue;Console.WriteLine(Withdrawfailed.);returnfalse;publicoverridestringToString()returnString.Format(JupiterBankSaver:Balance=0,6:C,balance);可见,这两个实现类多继承了IBankAccount接口,因此它们必须要实现接口中的所有声明的方法。要不然,编译就会出错。让我们来测试一下,下面是测试代码:staticvoidMain(stringargs)IBankAccountvenusAccount=newSaverAccount();IBankAccountjupiterAccount=newCurrentAccount();venusAccount.PayIn(200);jupiterAccount.PayIn(500);Console.WriteLine(venusAccount.ToString();jupiterAccount.PayIn(400);jupiterAccount.Withdraw(500);jupiterAccount.Withdraw(100);Console.WriteLine(jupiterAccount.ToString();请注意开头两句,我们把它们声明为IBankAccount引用的方式,而没有声明为类的引用,为什么呢?因为,这样我们就可以让它指向执行这个接口的任何类的实例了,比较灵活。但这也有个缺点,如果我们要执行不属于接口的方法,比如这里重载的ToString()方法,就要先把接口的引用强制转换成合适的类型了。接口的继承接口也可以彼此继承,就象类的继承一样。比如我们又声明一个接口ITransferBankAccount,它继承于IBankAccount接口。interfaceITransferBankAccount:IBankAccountboolTransferTo(IBankAccountdestination,decimalamount);在这个接口中,又新增加了一个方法TransferTo(),所以如果我们要写一个类从ITransferBankAccount继承的话,就必须要实现IBankAccount和ITransferBankAccount两个接口所有的方法声明。即:classCurrentAccount:ITransferBankAccountprivatedecimalbalance;publicdecimalBalancegetreturnbalance;publicvoidPayIn(decimalamount)balance+=amount;publicboolWithdraw(decimalamount)if(balance=amount)balance-=amount;returntrue;Console.WriteLine(Withdrawfailed.);returnfalse;publicoverridestringToString()returnString.Format(JupiterBankSaver:Balance=0,6:C,balance);publicboolTransferTo(IBankAccountdestination,decimalamount)if(Withdraw(amount)destination.PayIn(amount);returntrue;elsereturnfalse;总结起来说,使用C#接口应注意几个问题:1、C#中的接口是独立于类来定义的。这与 C+模型是对立的,在 C+中接口实际上就是抽象基类。2、接口和类都可以继承多个接口。3、类可以继承一个基类,
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年食品与饮料行业餐饮业数字化转型研究报告
- 2025年事业单位工勤技能-河南-河南机械热加工三级(高级工)历年参考题库典型考点含答案解析
- 2025年事业单位工勤技能-河南-河南假肢制作装配工三级(高级工)历年参考题库典型考点含答案解析
- 2024版单位车辆出租合同
- 2025年事业单位工勤技能-江西-江西热力运行工四级(中级工)历年参考题库含答案解析(5套)
- 2025年事业单位工勤技能-江西-江西土建施工人员五级(初级工)历年参考题库含答案解析(5套)
- 2025年事业单位工勤技能-江苏-江苏热处理工一级(高级技师)历年参考题库含答案解析(5套)
- 2025年事业单位工勤技能-新疆-新疆舞台技术工三级(高级工)历年参考题库含答案解析(5套)
- 2025年事业单位工勤技能-广西-广西殡葬服务工三级(高级工)历年参考题库典型考点含答案解析
- 2025年事业单位工勤技能-广西-广西家禽饲养员一级(高级技师)历年参考题库含答案解析
- 办公室文秘岗试题带答案
- 2025年河南疾控中心考试题库
- 2025-2026学年人教精通版四年级英语上册(全册)教学设计(附目录)
- 2025年【高压电工】模拟试题及答案
- 养老护理员竞赛理论试卷答案(含答案)
- 2025年四川省能源投资集团有限责任公司人员招聘笔试备考题库及答案详解(新)
- 广东省公路服务区管理系统升级及运维项目
- 造林后续管理办法
- 《慢性萎缩性胃炎中西医结合诊疗专家共识(2025)》解读 3
- GB/T 311.2-2013绝缘配合第2部分:使用导则
- GB/T 13912-2002金属覆盖层钢铁制件热浸镀锌层技术要求及试验方法
评论
0/150
提交评论