版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
抽象类多态和接口第1页,共23页。什么是抽象类?抽象方法:包含方法定义,但没有具体实现的方法,需要其子类或者子类的子类来具体实现。抽象类:含有一个或多个抽象方法的类称为抽象类。抽象类不能够被实例化,这是因为它包含了没有具体实现的方法。使用关键字abstract修饰第2页,共23页。声明抽象类抽象类publicabstractclassPlayer抽象方法1.在C#中,使用关键字abstract来定义抽象方法(abstractmethod),并需要把abstract关键字放在访问级别修饰符和方法返回数据类型之前,没有方法实现的部分,格式如下: publicabstractvoidTrain();2.子类继承抽象父类之后,可以使用override关键字覆盖父类中的抽象方法,并做具体的实现,格式如下: publicoverridevoidTrain(){……}第3页,共23页。抽象类和抽象方法abstractclassClassOne{
//类实现}访问修饰符派生类的基类不能实例化第4页,共23页。abstractclassBase{//成员变量intbasevar;//成员函数abstractvoidbase_fun1(parameters);//无法实现
…….}抽象方法classDerived:Base{//成员变量intderivedvars;//成员函数overridevoidBase_fun1(parameters){//实际实现...}抽象类派生类提供重写方法原型必须重写
抽象类和抽象方法第5页,共23页。演示usingSystem;namespaceExample_5{abstractclassABC{ publicabstractvoidAFunc(); publicvoidBFunc() { Console.WriteLine(“这是一个非抽象方法!"); }}classDerv:ABC{ publicoverridevoidAFunc() { Console.WriteLine(“这是一个抽象方法!"); }}抽象类–不能实例化派生类–重写方法staticvoidMain(string[]args){DervobjB=newDerv();objB.AFunc();objB.BFunc();}第6页,共23页。abstractclassMyAbs{ publicabstractvoidAbMethod();}//派生类classMyClass:MyAbs{ publicoverridevoidAbMethod() { Console.WriteLine(“在MyClass中实现的抽象方法"); }}//派生自MyClass的子类classSubMyClass:MyClass{ publicvoidGeneral() { //未实现AbMethod抽象方法 Console.WriteLine("在SubMyClass中未实现的抽象方法"); }}staticvoidMain(string[]args){ SubMyClassobjSubClass=newSubMyClass(); objSubClass.General();}第7页,共23页。演示publicabstractclassPlayer{publicabstractvoidTrain();//抽象方法:训练}publicclassFootballPlayer:Player{publicoverridevoidTrain(){ Console.WriteLine("Footballplayersaretraining...");}}publicclassSwimPlayer:Player{publicoverridevoidTrain(){ Console.WriteLine("Swimplayersaretraining...");}}publicclassSprinters:Player{publicoverridevoidTrain(){ Console.WriteLine("Sprintersaretraining...");}}抽象类–不能实例化派生类–重写方法staticvoidMain(string[]args){FootballPlayerfPlayer=newFootballPlayer();fPlayer.Train();
SwimPlayerswimPlayer=newSwimPlayer();swimPlayer.Train();Sprinterssprinters=newSprinters();sprinters.Train();}第8页,共23页。抽象类1、声明一个抽象方法使用abstract关键字。2、一个类中可以包含一个或多个抽象方法。3、抽象类中可以存在非抽象的方法。4、抽象类不能被直接被实例化。5、实现抽象类用“:”(冒号),实现抽象方法用override关键字。6、抽象类可以被抽象类所继承,结果仍是抽象类。7、抽象方法被实现后,不能更改修饰符。第9页,共23页。多态多态就是父类定义的抽象方法,在子类对其进行实现之后,C#允许将子类赋值给父类,然后在父类中,通过调用抽象方法来实现子类具体的功能。上一例子中,教练说“去训练吧”,所有的运动员肯定会知道该怎么去做。第10页,共23页。多态和重载的区别重载,是指允许存在多个同名函数,而这些函数的参数不同。重载的实现是:编译器根据函数不同的参数表,对同名函数的名称加以修饰。对于编译器而言,这些同名函数就成不同的函数。它们的调用地址在编译期间就绑定了。多态,是指子类重新定义父类的虚函数。当子类重新定义了父类的虚函数后,父类根据赋给它的不同的子类,动态调用属于子类的该函数,这样的函数调用在编译期间是无法确定的。不难看出,两者的区别在于编译器何时去寻找所要调用的具体方法,对于重载而言,在函数调用之前,编译器就已经确定了所要调用的方法,这称为“早绑定”或“静态绑定”;而对于多态,只有等到函数调用的那一刻,编译器才会确定所要调用的具体函数,这称为称为“晚绑定”或“动态绑定”。第11页,共23页。示例staticvoidMain(string[]args){ Playerp; p=newFootballPlayer(); p.Train(); p=newSwimPlayer(); p.Train();
p=newSprinters(); p.Train();}调用FootballPlayer类中Train方法调用SwimPlayer类中Train方法调用Sprinters类中Train方法第12页,共23页。演示public
class
Animal
{
public
virtual
void
Eat(){ Console.WriteLine("Animaleat……");
}
}
public
class
Cat
:
Animal
{
public
override
void
Eat()
{
Console.WriteLine("Cateat……");
}}
public
class
Dog
:
Animal
{
public
override
void
Eat()
{
Console.WriteLine("Dogeat……");
}}
派生类–重写方法staticvoidMain(string[]args){
Animalanimal;animal=newAnimal();animal.Eat();animal=newCat();animal.Eat();animal=newDog();animal.Eat();}示例第13页,共23页。虚方法(virtual)和抽象方法(abstract)的区别1.虚方法必须有实现部分,抽象方法没有提供实现部分,抽象方法是一种强制派生类覆盖的方法,否则派生类将不能被实例化。public
abstract
void
Eat();
public
virtual
void
Eat(){}
2.抽象方法只能在抽象类中声明,虚方法不是。其实如果类包含抽象方法,那么该类也是抽象的,也必须声明为抽象的。3.抽象方法必须在派生类中重写,这一点跟接口类似,虚方法不必。第14页,共23页。接口接口与抽象类非常相似,它定义了一些未实现的属性和方法。所有继承它的类都继承这些成员,在这个角度上,可以把接口理解为一个类的模板。
接口和抽象类的相似之处表现在以下两方面:
两者都包含可以由子类继承的抽象成员;两者都不直接实例化。第15页,共23页。两者的区别表现在以下几个方面:
抽象类除拥有抽象成员之外,还可以拥有非抽象成员;而接口所有的成员都是抽象的。抽象成员可以是私有的,而接口的成员一般都是公有的。接口中不能含有构造函数、析构函数、静态成员和常量。C#只支持单继承,即子类只能继承一个父类,而一个子类却能够继承多个接口。第16页,共23页。声明接口C#中声明接口的语法如下:
<access-modifer>interface<interface-name>{ //interfacemembers}接口的成员访问级别规定为public,因此,不用在声明成员时使用访问级别修饰符。根据上面给出的语法,下面代码来声明这个Ishape接口。
///<summary>///接口:形状///</summary>publicinterfaceIshape{ doubleGetArea();}第17页,共23页。接口 classIBase{
voidmethod1();intmethod2();intmethod3(float);//没有实现
…….}接口cinterface只有方法声明没有实现第18页,共23页。示例第19页,共23页。publicclassRectangle:Ishape{ publicdoubledblWidth; //宽 publicdoubledblHeitht; //高 ///构造函数publicRectangle(double_dblWidth,double_dblHeight) { this.dblWidth=_dblWidth; this.dblHeitht=_dblHeight; } ///求矩形面积 publicdoubleGetArea() { returnthis.dblHeitht*this.dblWidth; }}第20页,共23页。publicclassCircle:Ishape{ publicdoubledblRadious; //半径 ///构造函数publicCircle(doubleradious) { this.dblRadious=radious; } ///求矩形面积 publicdoubleGetArea() { returnMath.PI*this.dblRadious*this.dblRadious; }}第21页,共23页。publicclassTriangle:Ishape{ publicdoubledblEdge1; //边 publicdoubledblEdge2; //边 publicdou
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 吉林省水利水电勘测设计研究院2026年校园招聘29人备考题库及完整答案详解1套
- 2026年医疗行业外部评估合同
- 2025年柳州市壶西实验中学教育集团五菱校区秋季学期合同制教师招聘备考题库完整参考答案详解
- 2025中国科学院空间应用工程与技术中心2025年校园招聘备考题库及答案详解1套
- 2026年国际传统医药国际城市生态航空合同
- 2025年厦门市民政局补充非在编工作人员招聘备考题库带答案详解
- 2025年中共安丘市委、安丘市人民政府外聘法律顾问的备考题库及答案详解1套
- 长沙市食品药品检验所2025年公开招聘编外合同制人员备考题库及一套参考答案详解
- 2024年曲靖市富源县教育体育局所属学校引进教育人才专项招聘考试真题
- 深圳市检察机关2026年招聘警务辅助人员13人备考题库带答案详解
- 酒类进货合同范本
- 江苏省南京市2024-2025学年高一上学期期末学情调研测试物理试卷
- 2026年教师资格之中学综合素质考试题库500道及答案【真题汇编】
- TCEC5023-2020电力建设工程起重施工技术规范报批稿1
- 2025秋国开《人力资源管理理论与实务》形考任务1234参考答案
- 2026年5G网络升级培训课件
- 2026云南昆明铁道职业技术学院校园招聘4人考试笔试参考题库及答案解析
- 2025安徽宣城宁国市面向社会招聘社区工作者25人(公共基础知识)综合能力测试题附答案解析
- 模板工程技术交底
- 广东省广州市越秀区2024-2025学年上学期期末考试九年级数学试题
- 2025年区域经济一体化发展模式可行性研究报告及总结分析
评论
0/150
提交评论