




已阅读5页,还剩28页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
3月16日C#语言 第一部分 面向对象 (九) 方法的抽象和类的抽象 练习(二)我们继续,下面的例子展示了抽象的属性,我们说过,一个对象的属性由一组get/set方法来表现,所以属性也可以作为抽象存在。下面的例子我们定义了Person类,其EyeColor属性为一个抽象属性,由其子类来具体定义。看代码:1usingSystem;2usingSystem.Collections.Generic;3usingSystem.Linq;4usingSystem.Text;56namespaceEdu.Study.OO.UseAbstact278/9/又见人类10/11publicabstractclassPerson12/13/人名字字段14/15privatestringname;1617/18/构造器,输入人名19/20publicPerson(stringname)21this.Name=name;222324/25/人名属性26/27publicstringName28get29returnname;3031set32name=value;33343536/37/定义一个抽象属性,指明这个属性必须具备get/set访问器,都是抽象的38/这里为了明确,所以为该属性定义了set访问器,其实也不是没有道理,戴个隐形眼镜就可以改变眼睛的颜色了39/当然,也可以只定义某一个访问器,形成抽象只读属性或抽象只写属性40/41publicabstractstringEyeColor42get;43set;4445464748/49/定义亚洲人类,继承自人类50/51publicclassAsiaPerson:Person5253/54/隐形眼镜颜色字段55/56privatestringlensesColor;5758/59/构造器,调用超类构造器60/61publicAsiaPerson(stringname)62:base(name)636465/66/眼睛颜色属性,实现超类抽象属性67/68publicoverridestringEyeColor69get70/如果戴隐形眼镜,则返回隐形眼镜的颜色,否则返回黑色71if(this.lensesColor!=null)72returnthis.lensesColor;73else74returnBlack;757677set78/无法设置眼睛的颜色,所以给隐形眼镜加上颜色79this.lensesColor=value;8081828384/85/欧洲人类86/87publicclassEuropePerson:Person8889/90/隐形眼镜颜色字段91/92privatestringlensesColor;9394/95/构造器,调用超类构造器96/97publicEuropePerson(stringname)98:base(name)99100101/102/眼睛颜色属性,实现超类抽象属性103/104publicoverridestringEyeColor105get106/如果戴隐形眼镜,则返回隐形眼镜的颜色,否则返回蓝色107if(this.lensesColor!=null)108returnthis.lensesColor;109else110returnBlue;111112113set114/无法设置眼睛的颜色,所以给隐形眼镜加上颜色115this.lensesColor=value;116117118119120classProgram121staticvoidMain(stringargs)122Personperson=newAsiaPerson(王毛毛);123Console.WriteLine(0眼睛颜色为:1,person.Name,person.EyeColor);124person.EyeColor=Brown;125Console.WriteLine(0眼睛颜色为:1,person.Name,person.EyeColor);126127person=newEuropePerson(WangMaomao);128Console.WriteLine(0眼睛颜色为:1,person.Name,person.EyeColor);129person.EyeColor=Green;130Console.WriteLine(0眼睛颜色为:1,person.Name,person.EyeColor);131132133另外,我们也可以单独定义get或set访问器中的一个为抽象。这里就不做展示了。2:22| 添加评论| 固定链接| 写入日志| C#C#语言 第一部分 面向对象 (九) 方法的抽象和类的抽象 练习(一)上一章我们讲了方法和类的抽象,这一章我们从一些例子,继续加深对抽象的理解。第一个例子,我们定义了形状类(Shap类),从类名字就可以看出该类必然是一个抽象类。形状本来就很抽象嘛。好了,既然是形状,就必然有面积,Shap类的Area方法必然是一个抽象方法。接下来,我们创建一个子类:正多边形类(Polygon类),继承自Shap类。这个类比形状类具体多了,我们知道了一个新的属性:边长。但只知道边长依旧无法求出形状的面积,所以其继承下来的Area方法依旧只能作为抽象方法,所以Polygon类仍是一个抽象类。最后,定义正四边形类和正五边形类,这两个类显然非常具体了,可以定义Area方法了。就这样,看代码:1 usingSystem;2 usingSystem.Collections.Generic;3 usingSystem.Linq;4 usingSystem.Text;5 6 namespaceEdu.Study.OO.UseAbstract7 8 /9 /定义形状类10 /11 publicabstractclassShap12 /13 /定义抽象方法,求面积,对于形状类,面积方法没有方法体14 /15 /面积16 publicabstractdoubleArea();17 18 19 /20 /定义多边形类,此类继承了Area方法,但并未实现,所以依旧是抽象类21 /22 publicabstractclassPolygon:Shap23 24 /25 /边长字段26 /27 privatedoublesideLength;28 29 /30 /构造器,输入边长31 /32 publicPolygon(doublesideLength)33 this.SideLength=sideLength;34 35 36 /37 /边长属性38 /39 publicdoubleSideLength40 get41 returnsideLength;42 43 set44 if(value0)45 sideLength=value;46 else47 Console.WriteLine(边长必须大于0。);48 49 50 51 52 53 /54 /定义正方形类,继承自多边形类(Polygon类)55 /56 publicclassSquare:Polygon57 58 /59 /构造器60 /61 publicSquare(doublesideLength)62 :base(sideLength)63 64 65 /66 /求正方形面积,实现超类的抽象方法67 /68 publicoverridedoubleArea()69 returnMath.Pow(this.SideLength,2);70 71 72 73 /74 /定义五边形类75 /76 publicclassPentagon:Polygon77 78 /79 /构造器80 /81 publicPentagon(doublesideLength)82 :base(sideLength)83 84 85 /86 /求五边形面积,这里使用工程计算求近似值,即边长的平方乘以系数1.7287 /88 publicoverridedoubleArea()89 returnMath.Pow(this.SideLength,2)*1.72F;90 91 92 93 classProgram94 95 staticvoidMain(stringargs)96 97 /使用Shap类变量引用到Square类实例上98 Shapshap=newSquare(10);99 /输出面积结果100 Console.WriteLine(面积=0,shap.Area();101 102 /使用Shap类变量引用到Pentagon类实例上103 shap=newPentagon(10);104 /输出面积结果105 Console.WriteLine(面积=0,shap.Area();106 107 108 2:22| 添加评论| 固定链接| 写入日志| C#C#语言 第一部分 面向对象 (八) 方法的抽象和类的抽象Technorati 标签: C#,学习当我们对客观事物进行分类时,常常会遇到这样一个问题:有一些类并不知道自己的某些方法具体的实施流程是什么。这样的类非常多,例如有一个Person类,其必然有一个Speak方法,因为所有的Person都可以Speak,但当我们设计Person类时,却无法写出Speak方法体内的一行代码。因为Person类太概括了,如果不明确的指出是哪一国人,我们无法得知Speak方法具体怎么发生。一个类,具有某个行为,但无法得知该行为的具体流程。这样的行为称为抽象行为,体现在代码中就是“抽象方法”。好了,现在我们有一个拥有抽象方法的类,那当我们试图生成这个类的实例时,矛盾就产生了。实例一旦生成,就表明它是一个客观存在的具体事物,不可能存在尚未确定的方法。所以一旦一个类中具备抽象的方法,则这个类被称为“抽象类”。抽象类无法实例化对象,这是规定。抽象是面向对象语言的类得以连续继承的关键。OK,总结一下:超类定义了两部分方法, 一部分方法,超类知道其执行流程,这部分方法要么被子类直接继承,要么被子类继承后覆盖; 一部分方法,超类并不知道其具体执行流程,所以超类给出定义,由知道其具体执行流程的那个子类来覆盖实现该方法。 好了,我们来举个例子:1 usingSystem;2 3 namespaceEdu.Study.OO.Abstract4 5 /6 /依旧创建一个人类,这次这个类是“抽象”的,abstract关键字表示抽象7 /8 publicabstractclassPerson9 10 /11 /名称字段12 /13 privatestringname;14 15 /16 /年龄字段17 /18 privateintage;19 20 /21 /性别字段22 /23 privateboolsex;24 25 /26 /构造器27 /28 publicPerson(stringname,intage,boolsex)29 this.Name=name;30 this.Age=age;31 this.sex=sex;32 33 34 /35 /性别属性(只读)36 /37 publicboolSex38 get39 returnsex;40 41 42 43 /44 /年龄属性45 /46 publicintAge47 get48 returnage;49 50 set51 age=value;52 53 54 55 /56 /姓名属性57 /58 publicstringName59 get60 returnname;61 62 set63 name=value;64 65 66 67 /68 /去厕所的方法(抽象),abstract关键字表示方法抽象69 /70 publicabstractvoidGoToilet();71 72 73 /74 /男人类,继承自Person类75 /76 publicclassMan:Person77 78 /79 /构造器80 /81 publicMan(stringname,intage)82 :base(name,age,true)83 84 85 /86 /抽烟方法87 /88 publicvoidSmork()89 Console.WriteLine(0抽了一支烟。,this.Name);90 91 92 /93 /去厕所的方法(实现超类抽象方法,注意要使用override关键字)94 /95 publicoverridevoidGoToilet()96 Console.WriteLine(0解决了燃眉之急。,this.Name);97 this.Smork();98 99 100 101 /102 /女人类,继承自Person类103 /104 publicclassWoman:Person105 106 /107 /构造器108 /109 publicWoman(stringname,intage)110 :base(name,age,false)111 112 113 /114 /女人化妆的方法115 /116 publicvoidMakeup()117 Console.WriteLine(0化妆完毕。,this.Name);118 119 120 /121 /女人去厕所方法(实现超类抽象方法,注意要使用override关键字)122 /123 publicoverridevoidGoToilet()124 Console.WriteLine(0解决了燃眉之急。,this.Name);125 this.Makeup();126 127 128 129 /130 /厕所类131 /132 publicclassTolite133 134 /135 /进入厕所的方法136 /137 publicvoidComming(Personperson)138 person.GoToilet();139 140 141 142 143 classProgram144 145 staticvoidMain(stringargs) 146 /一旦成为抽象类,则无法实例化对象147 /Personperson=newPerson(小张,22,true);148 149 /定义一男一女150 Manzhang=newMan(小张,22);151 Womanli=newWoman(小丽,18);152 153 /定义厕所对象154 Tolitetolite=newTolite();155 156 /一男一女去厕所157 tolite.Comming(zhang);158 tolite.Comming(li);159 160 161 可以看到,子类一旦继承了一个抽象类,就应该实现超类中的抽象方法,使子类得以能够创建实例。但如果子类确定无法实现超类中定义的抽象方法,则子类也必须作为一个抽象类存在,因为子类继承了一个抽象方法,但却没有能够覆盖它,给其提供方法体。一般而言,抽象类中必然存在抽象的方法。但对于一个没有抽象方法的类,也可以使用abstract关键字声明其为抽象类,此时这种声明方法仅仅是为了阻止这个类实例化,指明这个类必须被继承而已。0:57| 添加评论| 固定链接| 写入日志| C#3月12日C#语言 第一部分 面向对象 (七) 方法重载一只狼狗无忧无虑的走在大街上,狼狗天性好斗,所以应该有一个Fight方法。这时候他碰到了一只小狗,即Puppy类的一个对象,此时狼狗调用Fight方法,将这只puppy作为参数传入,将其狠狠修理了一顿。不一会儿,它又碰到一只大狗,很凶恶的样子,此时狼狗的心里没有必胜的把握,但它依旧调用了Fight方法,将大狗作为参数传入。不过这次,Fight方法只是示威了一下而已,叫了几声,然后就结束了。又过了一会儿,它碰到了一大群狗,即一个狗数组,此时狼狗吓得屁滚尿流,但还是调用了Fight方法,将狗数组作为参数传入。这次,Fight方法执行的结果,狼狗逃之夭夭了。可见,在我们现实生活中,总是存在这样一种情况:某类对象的某种行为,因为外界条件不同(参数不同),执行的具体流程也不同。体现在编程代码中,就是方法的重载。在同一个类(或某个类和它的子类)中,一系列同名的方法就构成了“重载”,重载的条件是:方法名相同,参数列表不同。对于子类要重载超类方法的情况,超类该方法必须为protected或public类型。看代码:1 usingSystem;2 3 namespaceEdu.Study.OO.Overload4 5 /6 /继续人类7 /8 publicclassPerson9 10 /11 /保存名字的字段12 /13 protectedstringname;14 15 /16 /保存年龄的字段17 /18 protectedintage;19 20 /21 /保存性别的字段22 /23 protectedboolsex;24 25 /26 /带有参数的构造器27 /28 publicPerson(stringname,intage,boolsex)29 this.Name=name;30 this.Age=age;31 this.sex=sex;32 33 34 /35 /姓名属性36 /37 publicstringName38 get39 ;40 41 set42 =value;43 44 45 46 /47 /年龄属性48 /49 publicintAge50 get51 returnage;52 53 set54 age=value;55 56 57 58 /59 /性别属性60 /61 publicboolSex62 get63 returnsex;64 65 set66 sex=value;67 68 69 70 /71 /显示个人信息的方法72 /73 publicvoidShowMe()74 Console.WriteLine(姓名:0,性别:1,年龄:2岁。,this.Name,this.Sex,this.Age);75 76 77 78 /79 /男人类80 /81 publicclassMan:Person82 83 /84 /构造器。85 /86 publicMan(stringname,intage)87 :base(name,age,true)88 89 90 /91 /表示男人抽烟的方法92 /93 publicvoidSmork()94 Console.WriteLine(0抽了一根烟,base.Name);95 96 97 98 /99 /女人类,从Person类继承100 /101 publicclassWoman:Person102 103 /104 /构造器105 /106 publicWoman(stringname,intage)107 :base(name,age,false)108 109 110 /111 /表示女人化妆的方法112 /113 publicvoidMakeup()114 Console.WriteLine(0化妆完毕,base.Name);115 116 117 118 /119 /厕所类120 /121 publicclassToilet122 123 /124 /厕所进入方法,参数为Man类型125 /126 publicvoidComming(Manman)127 Console.WriteLine(0进了男厕所,man.Name);128 man.Smork();129 130 131 /132 /厕所进入方法,参数为Woman类型133 /134 publicvoidComming(Womanwomen)135 Console.WriteLine(0进了女厕所,women.Name);136 women.Makeup();137 138 139 140 classProgram141 staticvoidMain(stringargs)142 143 /实例化厕所对象144 Toiletwc=newToilet();145 146 /实例化一个男人和一个女人147 Manwang=newMan(小王,22);148 Womanli=newWoman(小丽,19);149 150 /调用厕所类的Comming方法,分
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 平安校园汇报工作总结
- 传媒公司运营主管岗位职责-运营主管岗位职责
- 校服采购合同管理实务指南
- 员工离职协议书模板及打印流程
- 二零二五年度地下室承台施工劳务人员工资支付合同
- 2025版架子管及扣件安全性能检测服务合同范本
- 二零二五年度物流配送服务客户合作协议大全
- 二零二五年度租赁合同模板官方规范
- 二零二五年度商业保理贷款担保合同示范文本
- 2025版车辆租赁与驾驶培训综合服务合同
- GB/T 9869.2-2025橡胶用硫化仪测定硫化特性第2部分:圆盘振荡硫化仪
- 保密教育培训课件内容
- 陕西省专业技术人员继续教育2025公需课《党的二十届三中全会精神解读与高质量发展》20学时题库及答案
- 2024-2025学年人教版数学五年级下学期期末试卷(含答案)
- 高压氧治疗相关知识
- 外科学麻醉专题知识讲座培训课件
- 课程设计与评价
- 霍尔电流传感器实训台课件
- 2023年国药控股股份有限公司招聘笔试题库及答案解析
- 应急中心组织架构
- 混凝土搅拌站实验室质量管理手册47590试卷教案
评论
0/150
提交评论