




已阅读5页,还剩1页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
实例解析C#抽象类近来有很多童鞋问我有关抽象类的问题,很多初学者不明白为什么要有抽象类,什么情况下使用抽象类。网上搜了下,还真的没多少文章讲此类问题,那么我就在这里简单讲下,鉴于各类书籍、论坛、帖子上有关C#抽象类的语法现象解释的已经足够清楚了,我在这里就只说下抽象类在什么情况下用,举几个例子,并总结了一些C#抽象类的注意要点,供大家参考。我想大家都打过CS吧!(什么,没打过?拖出去)假如我们现在要开发一个模拟CS的游戏。我们的业务很简单,要求如下:1、 游戏中要有恐怖分子,一个恐怖分子一次只能持有一支枪2、 游戏中有多种枪支3、 恐怖分子可以选择枪支使用4、 恐怖分子可以开枪杀人仅此4条,为了使程序足够简单,能说明我们主要目标就行,所以我们用控制台程序来模拟实现。方法1我们先来看第一种实现情况,假设,游戏中现在有手枪(Pistol)和步枪(Rifle),那么我们必然需要有对应的两个枪械的类。/手枪类public class Pistol public void Shoot() Console.WriteLine(手枪开始射击:叭叭叭); /步枪类public class Rifle public void Shoot() Console.WriteLine(步枪开始射击:哒哒哒。); 有了枪械,就可以来实现游戏中的恐怖分子了。业务清单中有一条,匪徒可以选择所用枪支,那么,我们的类可能就需要实现为下边的情况。/恐怖分子类public class Terrorist private Pistol pistol; private Rifle rifle; public void SetGun(object gun) /换枪 if (gun is Pistol) pistol = (Pistol)gun; /只能拿一支枪,在拿手枪的同时, rifle = null; 要让步枪为null else rifle = (Rifle)gun; pistol = null; public void KillEnemy() Console.WriteLine(恐怖分子开始杀人!); if (rifle = null) pistol.Shoot(); else rifle.Shoot(); 如果运行游戏,还需要有个表示层。我们这样来调用这写类:class Program static void Main(string args) Terrorist laDeng = new Terrorist();/new出来一个拉登 laDeng.SetGun(new Pistol();/给他一支手枪 laDeng.KillEnemy();/拉登开枪 laDeng.SetGun(new Rifle(); laDeng.KillEnemy(); 好了,程序写到这里就基本实现了我们的业务要求,我们来分析下程序的结构关系,类图是个好的工具,我已经画出来了,请看。其中,带减号“-”的表示是private的,加号“+”的表示是public的。我们可以发现Terrorist和两个枪支类Rifle以及Pistol是一种依赖关系。那么这样实现我们的控制台版的CS游戏好不好呢?Absolutely不好!假如,游戏上线1个月,我们需要更新枪支来吸引新老玩家,我们想要增添一款狙击步枪AWP。好吧,我是一个OO程序员,这难不倒我,我只需要添加一个AWP类:public class AWP public void Shoot() Console.WriteLine(AWP开始射击:啪。一枪毙敌); 然后我们需要修改下Terrorist类,添加一个private字段AWP,然后修改SetGun()方法,我们需要让ifelse变的更长。接下来,还要修改KillEnemy。还是ifelse。假如,又过了一个月,我们又想添加一款冲锋枪M4A1。那么,添加类,修改Terrorist。假如,又过了一个月。Oh my godness!你杀了我吧。你会发现,你的代码在不停的修改,如果哪一款枪械决定删除了,简直要被逼疯了。那么,好吧,我决定使用抽象类试试方法2思考上一个方法,我们的麻烦来自于哪里呢?来自于每一种枪械都是一个单独的类,她们之间没有任何关联关系,这就使得我们匪徒类Terrorist必须有各个枪械类型的引用字段,但是。业务要求Terrorist一次只能用一支枪。那么,如果我们能用一个字段来保留这些枪支的引用就好了。我们设计一个抽象的抢类,让所有的枪械都继承于这个抽象的枪类本着这个思路,我们先画一张新方法的类图。接下来就是代码实现了。我们先来设计抽象类AbstractGun。public abstract class AbstractGun public abstract void Shoot();这里代码非常简单,抽象类AbastractGun只有一个抽象方法Shoot()。所有的枪支类型,都要继承于此抽象类。比如Rifle类public class Rifle:AbstractGun public override void Shoot() Console.WriteLine(步枪开始射击:哒哒哒。); 这里的每一个子类,都必须override抽象类的Shoot()方法。(这是C#抽象类的语法要求,不懂的拖出去扁。)。下面Terrorist类就简单了。public class Terrorist private AbstractGun gun; public Terrorist() public void SetGun(AbstractGun gun) this.gun = gun; public void KillEnemy() gun.Shoot(); 再也没有烦人的ifelse了,整个世界清静了。那么下边开始游戏,new一个拉登class Program static void Main(string args) Terrorist laDeng = new Terrorist();/new出来一个拉登 laDeng.SetGun(new Pistol();/给他一支手枪 laDeng.KillEnemy();/拉登开枪 laDeng.SetGun(new Rifle(); laDeng.KillEnemy(); 如果,哪一天,你需要添加一种枪械叫机机关枪(一)。那么,你只需要再写一个机关枪的类public class MachineGun:AbstractGun public override void Shoot() Console.WriteLine(机关枪开始射击:突突突。); 这时候,你会发现,Terrorist的代码根本无需改动,因为,他需要的枪的字段只是一个抽象的。好了,前台立刻可以使用MachineGun了。laDeng.SetGun(new MachineGun ();laDeng.KillEnemy();好了,通过这个例子,我想你已经懂得C#抽象类的使用了。需要注意的是:1、 抽象类只能被继承,不能实例化,比如你要是想SetGun(new AbstracGun()那就不行。2、 抽象类中可以包含抽象成员,也可
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 实验小学突发停电事故应急预案10篇
- 水表井安全知识培训内容课件
- 人防物资调配与储存管理方案
- 小学五年级英语上册Unit5单元重难点知识速记与巧练(含答案)
- 氢能产业园氢能燃料电池商业化推广策略
- 隧道水文勘察与分析
- 学生宿舍节能减排技术应用方案
- 建筑工程项目施工现场卫生管理方案
- 水电站安全知识培训内容课件
- 知识点3.2造型要素设计构成设计造型75课件
- 生物制品生产工艺过程变更管理技术指导原则
- 建筑施工现场签证单(模板)
- GBZ(卫生) 49-2014职业性噪声聋的诊断
- GB/T 9729-2007化学试剂氯化物测定通用方法
- GB/T 7588.2-2020电梯制造与安装安全规范第2部分:电梯部件的设计原则、计算和检验
- GB/T 13560-2017烧结钕铁硼永磁材料
- 三视图及尺寸标注课件
- 混凝土配合比验证检验委托书模板
- 住房公积金投诉申请书
- 众辰变频器说明书3400
- 小学教师量化考核表
评论
0/150
提交评论