




已阅读5页,还剩3页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
本篇博客我们来学习面向对象的多态性,多态性主要的表现形式就是在继承中当派生类从基类继承时,它会获得基类的所有方法、字段、属性和事件。当父类和子类的成员签名相同的时候,我们可以定义让子类的这个同名成员以何种形式显示出来,父类的这个的成员在子类中又用何种方式存在,这种多面的表现方法我们称为多态。如果我们要更改基类的数据和功能时,也就是说子类中可以以自己的方式去实现父类的功能,有两种方式:1.我们还在子类中可以使用override关键字重写基类中用virtual关键字修饰的虚拟的基成员;2.可以在子类中使用new关键字让派生成员替换基成员,此时基类成员只是被有意的隐藏掉了。 举一个现实生活的例子,我们来理解一下多态,爸爸如果有一套房子留给了儿子,并对儿子说:这个房子我装修了一下,如果你不喜欢这个风格,可以自己再重新翻新一下,但是我就有一个要求,就是这个房子唯一不变就是我喜欢的挂在走廊墙上的一张油画,你不许拆掉它。儿子欣然同意,拿到钥匙去看了看房子,儿子有点对爸爸的审美产生了质疑,装修的风格也太古朴了,于是儿子决定把客厅和卧室全部装修了,改成了后现代主义的风格,这时发生了我们所说的多态的第一种方式,被称为重写或覆写,爸爸给房子时,把允许重新装修的地方用virtual关键字修饰,儿子就可以用override关键字修饰那些允许重新装修的房间,这时父亲来到这个房子时会发现房子的客厅和卧室全部改变了。装修完客厅和卧室后,儿子怎么看都觉得走廊上的油画太格格不入了,因为油画的内容是田园风情,这时儿子想起爸爸不让动这幅画,所以儿子想到了一个方法,就买了一副新的抽象派的油画盖在爸爸的画上面,这样爸爸如果来到家,想看自己的画,也是存在的,这时发生的就是第二种方式,如果爸爸想在儿子的房子里看自己的东西,就使用base关键字,儿子的新油画用new关键字隐藏住爸爸的画。 通过这个例子我们应该就能理解一点多态的含义了,我们先来学习第一种情况:重写。在使用重写的时候,一定要注意到一点,就是为了让子类可以完全的重写父类中的成员,父类在定义这些成员的时候,一定要使用virtual关键字,让可以重写的方法成为虚方法,让可以重写的属性成为虚属性,子类在重写这个方法或属性的时候,将virtual替换成override关键字,代表已将父类的成员替换为了它自己的成员并实现。我们来看一下具体的语法,为了举例方便,我采用的是方法重写的实例,如:class FatherClasspublic virtual void Method()class SonClass:FatherClasspublic override void Method() 大家来看看父类中的方法,按照我们上节课所学的如果父类中的成员不是private修饰时,子类中是都可以访问到一个成员,但是重写是特殊的,根据我举的例子大家回忆一下,这时如果父亲来到儿子的房子,将会只存在被儿子重新装修的客厅和卧室,这两个屋原来的风格都不存在了。也就是说,在子类中,这两个屋子只有一种形态,就是儿子重新装修定义的。虽然其他的屋子父亲也允许儿子装修,使用了virtual关键字修饰了,但是因为儿子没有使用override关键字重新装修,其他几个屋的表现形态还是父亲原先存在的。这就说明了一点,子类要想重写父类的方法,必须是父类定义了virtual,子类使用override。当如果我想在子类的方法中再用父类的那个被覆盖的方法时,只需要使用base关键字就可以代表继承的父类了,base关键字我们在上节课的类七构造方法的继承中也学到过。我们把上面的语法在子类的Method方法中,加base用法,基本语法如下:public override void Method()base.Method(); 这样的话,在调用子类的Method方法时,虽然重写了这个方法,但是使用base关键字又再次引用了父类的Method方法。 当父类定义了virtual,而子类的同名方法没有使用override重写,这样是可以的,这时子类中仍然包括父类的方法,也就是说子类中有两个同名的方法,但是编译器在我们创建子类对象的时候,会显示子类的方法,而不会显示继承自父类那个同名的方法。如果你使用VS编译这样情况时,它会有一个警告:子类的方法将隐藏父类的方法。如果想重写请在子类中加入override关键字,如果想隐藏请使用new关键字。使用override关键字刚才我们已经讲过了,如果用new就代表创建一个新的方法,这个子类中的新方法隐藏父类的方法,这就是我们说的第二种多态的形式隐藏父类的方法。 隐藏父类方法,父类可以是virtual修饰的虚方法,也可以是普通方法应该在子类中显式的使用new关键字,告知编译器当调用子类的这个方法时,请显示出子类自定义的功能,当然如果要显示父类的方法也同样可以使用base关键字,我们来看下面的语法: class FatherClasspublic void Method() class SonClass:FatherClasspublic new void Method()base.Method(); 我今天所举出的实例比较简单,就是定义了3个类一个包含入口函数的Program类、一个F类,一个S类继承了F类,在F和S中各定义了3个方法,对照结果我们来看一下:重写和隐藏父类方法实例ITPUB个人空间 Y NdbTi;J6H 1 /定义一个F类w5j7cF0 2 class FITPUB个人空间5S j8?,_C,Sn-C 3 L4ThB.p8yEw0 4 /定义一个公有Method方法,子类中用new隐藏了本方法sD5xczxo0 5 public void Method()6L t!%c1a0 6 Bj*P2g%L0 7 Console.WriteLine(我是父类中的Method方法);Dv%h j WS Xn vW0 8 Console.WriteLine();6Jq Pvz0 9 ITPUB个人空间E j&r&O.uTm10 /定义了一个虚方法Method1,子类中重写了Method1.5BsB4h1h5X011 public virtual void Method1()lT7i!xR012 ITPUB个人空间4V;&gZQ V8WcVV0|A13 Console.WriteLine(我是父类中的Method1方法);wKDFlUf014 Console.WriteLine();kBL X6Jo Ge015 k5i(_2j&h016 /定义了一个虚方法Method2,子类中重写了Method2.子类中使用了base.method1,再次调用被重写了的Method1%A+3ffF017 public virtual void Method2()ITPUB个人空间s/T:u-Wp ua18 ITPUB个人空间s-sly gih19 Console.WriteLine(我是父类中的Method2方法);ITPUB个人空间A/Paee6D20 Console.WriteLine();ITPUB个人空间C0jdB XzW21 ITPUB个人空间3Z |awH22 %J,_(Fwhm I023 /定义一个继承F类的S类0I#VSO4oBH024 class S : FJD x%(d025 so;s.P1Vp026 /定义一个公有Method方法,隐藏了父类的方法ITPUB个人空间 rgh !D$oB27 public new void Method()N5WSM|j028 d)vZoa029 Console.WriteLine(我是子类中的Method方法,使用new关键字,显式的隐藏父类中的同名方法);3q%bJ3q8Oj7030 Console.WriteLine();ITPUB个人空间w SvE#R4W31 .8Qg J7y(t032 /定义一个重写父类Method1的方法Method1。ITPUB个人空间?m2c.G$U33 public override void Method1()ITPUB个人空间 f%V#x#P i34 ITPUB个人空间 X#g4f u-u35 Console.WriteLine(我是子类中的Method1方法,覆盖父类中的同名方法,此时S中没有了父类中Method1方法);7j7Du:wsP Q8Z B(D036 Console.WriteLine();df I+Fkq4v:B037 ITPUB个人空间(Hz*n3CsM-g Od38 /定义一个重写父类Method1的方法Method1,同时使用base调用父类的Method1。+N6eSu aww8kK4*b Q |039 public override void Method2()ITPUB个人空间 i:c#h$fA0kP9g40 ITPUB个人空间IxMad3Bu41F4Cbr042 Console.WriteLine(我是子类中的Method2,覆盖父类中的同名方法,调用base.method1);v,t0SVV9I+Q043 base.Method1();:B2L;o1oy2I(k+m044 Console.WriteLine();vR*X-(Nc045 -OG C4*d2Z)K:GYu046 m/s0s b,c4a0473mN8jNB.M048.A wb N7vy049 class ProgramITPUB个人空间3(P i50 ITPUB个人空间CM3u1w51 static void Main(string args)ITPUB个人空间3DP6Z&s8W u0ia;U-_52 ITPUB个人空间&a#,cK/f1Q v81U U53 / 创建一个S类的s对象bg9qs A#054 S s = new S();H(u SQZ+|&s)O055 / 创建一个F类的f对象$;pL_9I#d_H056 F f = new F();ITPUB个人空间 kEJpTv#+?57L9Ijl1?$z8y6.i058 /创建一个F类的fs对象,但是用S类来实现,这种方式是允许的。D/M.GC P059 /意思就是父亲到了儿子的房子去了,看到的油画应该是父亲的油画,房子还是从父亲那继承下的房子。ITPUB个人空间dVWsz!D.h60 /对象fs所引用出的成员,实际是从父类中继承来的成员,不是继承来的成员(如儿子自己买的电器)fs是无权访问的。%Ct4Ok061 /父类需要子类去实现的这种方式会在抽象类和接口中会用到。_fk8d8b,g cO!M:mH062 F fs = new S();ITPUB个人空间2usW+E+.r|63F,w)bw y:OBR064 /先观察一下子类使用new的Method方法中三对象的结果。nl5eeQY&d:L065 /-XP5g P1M1y/h?Q066 /子类的对象s引用的Method方法打印出的是子类的Method方法ITPUB个人空间6n%xYRL H,67 s.Method();RxB Edj068 /子类中的Method方法,因为使用了new,只是覆盖了父类的Method方法,4|G r Xy2T069 /所以父类的对象fs引用的Method方法打印出的是还是从父类中继承下来的Method方法wQB4O!Q1jIfoD070 fs.Method();ITPUB个人空间!A)PJW6TK8r71 /父类中的Method方法不变3Px14i4Y!WC072 f.Method();ZDY Qk d073 Console.WriteLine(-);ITPUB个人空间 y0d x-CSGg3G+b74ITPUB个人空间5c#V)?;.z dK75ITPUB个人空间.%s1f%p2a7Nj76 /先观察一下子类使用override的Method1方法中三对象的结果。#m Os/G!QJ4F$!fB077 /-mH4C4?L2w _p078 /子类的对象s引用的Method1方法打印出的是子类的Method1方法p8i9 u/n)y8f9t Y-DG!079 s.Method1();ITPUB个人空间D;w g *w980 /子类中的Method1方法,因为使用了override,重写了父类的Method1方法,ITPUB个人空间-q2k86_%qH81 /所以父类的对象fs引用的Method1方法打印出的是还是从子类中继承下来的Method1方法ITPUB个人空间_uK d ycB7_n f2EOIh82 /子类中只存在子类的Method1方法,结果如上.ITPUB个人空间L&D E1uL5D+z_$Q83 fs.Method1();TMX T;yG084 /父类中的Method方法不变ITPUB个人空间!W9rrs4g.s#L2385 f.Method1();ITPUB个人空间O2B A7l L.f!S86 Console.WriteLine(-);ITPUB个人空间(s8XY:IS*x U)KRz9f87N g A3MO&nF aX*088EbAr+IK0WH _089 /先观察一下子类使用override和base.method1的Method2方法中三对象的结果。-qt0J)4Cz O090 /-ITPUB个人空间 GM/?1gBN91 /因为使用了override,重写了父类的Method2方法,ITPUB个人空间#f3F$ Kb4qG92 /因为使用了base.Method1,所以在子类中会调用父类的Method1方法iuqIFc4yn093 /子类的对象s引用的Method1方法打印出的是子类的Method2方法和父类的Method1方法T&CH x)094 s.Method2();ITPUB个人空间qhn!Ex2s95 /子类中的Method2方法,因为使用了override,重写了父类的Method2方法,i tG z C5FY096 /所以父类的对象fs引用的Method2方法打印出的是还是从子类中继承下来的Method2方法ITPUB个人空间/h!Kb%O7GZ ,C97 /子类中只存在子类的Method2方法,结果如上.u3mj KFg N098 fs.Method2();ITPUB个人空间qc Y Ci/l9X99 /父类中的Method方法不变ITPUB个人空间qL!e5G11M100 f.Method2();ITPUB个人空间vdY6ZoK 7y m g101 Console.WriteLine(-);x y,VmM Dz Q0102 ITPUB个人空间 YTw 8u,K103 ITPUB个人空间_3H)z/JeGKWf结果如下:ITPUB个人空间. zeBn我是子类中的Method方法,使用new关键字,显式的隐藏父类中的同名方法我是父类中的Method方法我是父类中的Method方法-ITPUB个人空间N fr*F3UFs1q我是子类中的Method1方法,覆盖父类中的同名方法,此时S中没有了父类中Method1方法我是子类中的Method1方法,覆盖父类中的同名方
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年化工工艺操作安全认证考试预测题及培训教程
- 2025年初识专利挖掘和专利申请流程模拟题集及答案详解
- 2025年养老护理员高级面试指南认知症照护方向模拟题解析
- 2025年防爆通讯及仪表项目建议书
- 2025年舒血宁注射液项目发展计划
- 抢修安全知识培训课件
- 辽宁省普通高中2025-2026学年高二上学期期初开学考试模拟(2)数学试卷(含解析)
- 2025年无菌包装用包装材料项目合作计划书
- 2025年再生塑料:PVC再生料项目发展计划
- 徭役考试试卷及答案
- 中学藏文散文教学课件大纲
- 第4课《乡愁》课件-2025-2026学年统编版语文九年级上册
- 兵役法教学课件
- 第六届山东省无人机技术与应用职业技能竞赛(无人机测绘操控员)题库(含答案)
- 2025-2026学年人教版小学数学四年级上册教学计划及进度表
- 2025年秋季学期(统编版)二年级上册语文教学工作计划及教学进度表
- 2025年全国《质量知识竞赛》题库及答案
- 2025年呼伦贝尔农垦集团有限公司招聘笔试参考题库含答案解析
- 《铁路调车工作》课件
- 数据挖掘(第2版)PPT全套完整教学课件
- (完整版)五年级数学思维拓展课程整体设计
评论
0/150
提交评论