抽象类与密封类_第1页
抽象类与密封类_第2页
抽象类与密封类_第3页
抽象类与密封类_第4页
抽象类与密封类_第5页
已阅读5页,还剩15页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

抽象类与密封类,抽象类,有时候基类并不与具体的事物相联系,而是只表达一种抽象的概念,用以为它的派生类提供一个公共的界面,为此,C#中引入了抽象类abstractclass的概念。定义抽象类的语句格式为:abstractclass类名/抽象类的成员定义,抽象类,抽象类使用abstract修饰符,对抽象类的使用有以下几点规定:抽象类只能作为其它类的基类,它不能直接被实例化,而且对抽象类不能使用new操作符。抽象类如果含有抽象的变量或值,则它们要么是null类型,要么包含了对非抽象类的实例的引用。抽象类允许包含抽象成员,虽然这不是必须的。抽象类不能同时又是密封的。,抽象类,abstractclassVehicle/定义汽车类publicintwheels;/公有成员轮子个数protectedfloatweight;/保护成员重量publicVehicle(intw,floatg)wheels=w;weight=g;publicvirtualvoidSpeak()Console.WriteLine(thewvehicleisspeaking!);,抽象类,classCar:Vehicle/定义轿车类intpassengers;/私有成员乘客数publicCar(intw,floatg,intp):base(w,g)passengers=p;publicoverridevoidSpeak()Console.WriteLine(Thecarisspeaking:Di-di!);,抽象类,classTruck:Vehicle/定义卡车类intpassengers;/私有成员乘客数floatload;/私有成员载重量publicTruck(intw,floatg,intp,floatl):base(w,g)passengers=p;load=l;publicoverridevoidSpeak()Console.WriteLine(Thetruckisspeaking:Ba-ba!);,抽象类,classProgramstaticvoidMain(stringargs)Carc1=newCar(4,2,5);Truckt1=newTruck(6,5,3,10);c1.Speak();t1.Speak();,抽象方法,由于抽象类本身表达的是抽象的概念,因此类中的许多方法并不一定要有具体的实现,而只是留出一个接口来作为派生类重载的界面。举一个简单的例子,“图形”这个类是抽象的,它的成员方法“计算图形面积”也就没有实际的意义。面积只对“图形”的派生类比如“圆”、“三角形”这些非抽象的概念才有效,那么我们就可以把基类“图形”的成员方法“计算面积”声明为抽象的,具体的实现交给派生类通过重载来实现。,抽象方法,一个方法声明中如果加上abstract修饰符,我们称该方法为抽象方法(abstractmethod)。在抽象类中定义方法,由于无法为其实例化任何代码,所以也需要将其定义为抽象的,定义格式如下:publicabstractvoid方法名(方法参数);,抽象方法,abstractclassVehicle/定义汽车类publicintwheels;/公有成员轮子个数protectedfloatweight;/保护成员重量publicVehicle(intw,floatg)wheels=w;weight=g;publicabstractvoidSpeak();,抽象方法,classCar:Vehicle/定义轿车类intpassengers;/私有成员乘客数publicCar(intw,floatg,intp):base(w,g)passengers=p;publicoverridevoidSpeak()Console.WriteLine(Thecarisspeaking:Di-di!);,抽象方法,classTruck:Vehicle/定义卡车类intpassengers;/私有成员乘客数floatload;/私有成员载重量publicTruck(intw,floatg,intp,floatl):base(w,g)passengers=p;load=l;publicoverridevoidSpeak()Console.WriteLine(Thetruckisspeaking:Ba-ba!);,封闭类,如果所有的类都可以被继承,继承的滥用会带来什么后果,类的层次结构体系将变得十分庞大,类之间的关系杂乱无章,对类的理解和使用都会变得十分困难,有时候我们并不希望自己编写的类被继承,另一些时候,有的类已经没有再被继承的必要。C#提出了一个密封类sealedclass的概念帮助开发人员来解决这一问题,封闭类,密封类中不可能有派生类,如果密封类实例中存在虚成员函数,该成员函数可以转化为非虚的,函数修饰符virtual不再生效。,封闭类,abstractclassApublicabstractvoidF();sealedclassB:ApublicoverridevoidF()/F的具体实现代码如果我们尝试写下面的代码classC:BCC#会指出这个错误,告诉你B是一个密封类,不能试图从B中派生任何类。,密封方法,使用密封类可以防止对类的继承,C#还提出了密封方法,sealedmethod的概念以防止在方法所在类的派生类中对该方法的重载。对方法可以使用sealed修饰符,这时我们称该方法是一个密封方法。,密封方法,不是类的每个成员方法都可以作为密封方法,密封方法必须对基类的虚方法进行重载,提供具体的实现方法。所以,在方法的声明中sealed修饰符总是和override修饰符同时使用。,密封方法,classApublicvirtualvoidF()Console.WriteLine(A.F);publicvirtualvoidG()Console.WriteLine(A.G);,密封方法,classB:AsealedoverridepublicvoidF()Console.WriteLine(B.F);overridepublicvoidG()Console.WriteLine(B.G);,密封方法,c

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论