举例说明什么是抽象类!让抽象变的不再抽象
cac55 2024-09-20 12:42 11 浏览 0 评论
抽象类之所以比较难理解,大概就是因为他太抽象了吧,哈哈,这好像是废话。。
虽然很早之前就知道这个抽象类的概念,但是一直纠结于一个问题:你这个抽象类在实际开发过程中到底有个毛线用??
所以呢,今天想通过一个例子,来彻底搞清楚这家伙在实际开发中的作用!!
假设我是一个地下城的鬼剑士玩家,通过游戏可以实现以下功能:
- 我的鬼剑士一次只能放一个技能
- 我的鬼剑士有很多技能
- 我可以通过技能键选择释放哪个技能
- 我可以用技能打怪(打怪释放技能音效)
先来看不需要抽象类的实现方式:
第一步:定义技能!!
假设我现在5级,有两个技能分别是上挑(Up)和鬼斩(Kill),那我现在定义这两个技能:
public class Up { public void Speak() { // 上挑音效 Console.WriteLine("嘿!!!"); } } public class Kill { public void Speak() { // 鬼斩音效 Console.WriteLine("哈!!!"); } }
第二部:定义鬼剑士!!
大街上一堆角色,不同的角色有不同的属性,所以呢,会上挑和鬼斩的才能使鬼战士。
public class Swordsman { // 对应的两个技能 private Up up; private Kill kill; // 选择释放哪个技能 public void Select(object skill) { if (skill is Up) { up = (Up)skill; kill = null; } else { kill = (Kill)skill; up = null; } } // 释放不同的技能对应着不同的释放音效 public void Hit() { Console.WriteLine("开始打怪!!"); if(kill==null) { up.Speak(); } else { kill.Speak(); } } }
第三部:实例化一个鬼剑士,大街上全是鬼剑士,只有ID是我的名字的那个鬼剑士才是我的鬼剑士。
class Program { static void Main(string[] args) { // 实例化一个鬼剑士旭旭宝宝 Swordsman xuxubaobao = new Swordsman(); // 旭旭宝宝选择使用上挑并释放出去 xuxubaobao.Select(new Up()); xuxubaobao.Hit(); // 旭旭宝宝选择使用鬼斩并释放出去 xuxubaobao.Select(new Kill()); xuxubaobao.Hit(); } }
没问题,一切都是那么的美好!!大佬们玩的开心,我们程序员也露出了微笑。
But!!由于玩家们都是土豪,瞬间升到10级,老板们就督促程序员添加一个新技能崩天击(Knock)。
老夫一想,没问题,就开始搞了。
以下是修改过程:
第一步:老夫定义一个新技能的类崩天击(Knock)
public class Knock { public void Speak() { // 崩天击音效 Console.WriteLine("oh yeah !!!"); } }
第二步:老夫修改了Swordsman类
public class Swordsman { // 对应的两个技能 private Up up; private Kill kill; private Knock knock; // 选择释放哪个技能 public void Select(object skill) { if (skill is Up) { up = (Up)skill; kill = null; knock = null; } else if { kill = (Kill)skill; up = null; konck = null; } else { konck = (konck)skill; up = null; kill = null; } } // 释放不同的技能对应着不同的释放音效 public void Hit() { Console.WriteLine("开始打怪!!"); if(kill==null) { up.Speak(); } else if { kill.Speak(); } else { knock.Speck(); } } }
OK!
从上面可以看出,老夫为了新添加一个技能,在Swordsman类里新加了一个字段knock,在选择技能和释放技能处分别多加了一个else if,还不错可以顶得住!!
But,当我刚改好代码,那些大佬们一秒999级,这时候,老板让我赶紧给鬼剑士添加100个技能。
我瞬间一个晴天霹雳!!
这时候,一直偷偷爱慕我的香蕉君教给我了一个新技能——抽象类!!
于是,我用新的思想开始了抽象之旅:
第一步:定义技能
首先,定义一个抽象类AbstractSkill。老夫把什么上挑、鬼斩、崩天击、大吸全都抽象成一个类,名为AbstractSkill,同时里面存在一个技能音效的方法,但是释放的是什么音效呢?答案是没有音效。
public abstract class AbstractSkill { public abstract void Speak(); }
每一个具体的技能都继承至这个抽象类(override是将继承至AbstractSkill中的方法进行重写 -- 也就是给每个技能重新添加了音效):
public class Up:AbstractSkill { public override void Speak() { // 上挑音效 Console.WriteLine("嘿!!!"); } } public class Kill:AbstractSkill { public override void Speak() { // 鬼斩音效 Console.WriteLine("哈!!!"); } } public class Knock:AbstractSkill { public override void Speak() { // 崩天击音效 Console.WriteLine("oh yeah !!!"); } }
第二部:定义鬼剑士。
这时候我重新定义了鬼剑士(恩?? 代码好像少了点):
public class Swordsman { private AbstractSkill skill; public Swordsman() { } public void Select(AbstractSkill skill) { this.skill = skill; } public void Hit() { skill.Speak(); } }
第三部:实例化一个鬼剑士并放了三个技能。
class Program { static void Main(string[] args) { // 实例化一个鬼剑士旭旭宝宝 Swordsman xuxubaobao = new Swordsman(); // 旭旭宝宝选择使用上挑并释放出去 xuxubaobao.Select(new Up()); xuxubaobao.Hit(); // 旭旭宝宝选择使用鬼斩并释放出去 xuxubaobao.Select(new Kill()); xuxubaobao.Hit(); // 旭旭宝宝选择使用崩天击并释放出去 xuxubaobao.Select(new Knock()); xuxubaobao.Hit(); } }
这时候已经改好代码了,如果老夫想在加新的技能的话,直接定义一个新的技能类并继承于抽象类AbstractSkill:例如(小吸:Suck)
public class Suck:AbstractSkill { public override void Speak() { // 小吸音效 Console.WriteLine("oh oh oh!!!"); } }
所以呢,有了抽象类后只需要添加抽象类的下属的类即可,别的压根不用改,这一下子省了多少工夫啊!!!
Java肖先生:专注于Java开发技术的研究与知识分享!
————END————
- 点赞(感谢)
- ...
- 转发(感谢)
- ...
- 关注(感谢)
- ...
推荐阅读
相关推荐
- 让组策略保护Windows XP的安全
-
默认安装完WindowsXP之后,我们的WindowsXP并不很安全。因此,我们有必要对系统进行一些修修补补,一般情况下我们都要动用到注册表。诚然,修改注册表是一种非常有效的方法,但是它需要一定的...
- 你造吗?十种方式保护你免受"零日攻击"
-
|责编:王迪WindowsXP的寿终正寝,数据安全问题又再一次成为人们关注的焦点。近日,微软透漏,一个基于InternetExplorer的“零日攻击”给用户带来了严重破坏。“零日攻击”一种利用...
- 特立独行——打造游戏专用独立系统
-
大部分人的电脑是为了学习和工作用的,所以,如果你是一个游戏迷,那么推荐你安装一个独立系统专用于游戏,做到工作娱乐两不相扰。方案1:游戏专用移动WindowsXP目的:解决游戏兼容性问题喜欢玩游戏的都...
- 驰为VX8 3G Win8入门教程篇
-
距离Win8.1的正式发布也将近1年了,凭借着Win8.1在移动便携以及娱乐办公上的优势,现在的Win8平板越来越受到消费者的追捧,而驰为VX83G就是其中一款,搭载了卓越的英特尔Z3735G四核芯,...
- 易淘收银软件说明
-
易淘收银系统,简称易淘收银,专为小型及连锁零售、餐饮行业打造。基于SaaS模式,智能便捷,无需维护,轻量级设计却功能强大,简约而不失专业,助力门店高效管理收银。1、前台系统:收银客户端;2、后台系...
- CAD打不开怎么办?原因可能是电脑中毒了,6步就能完美解决问题
-
一、问题描述我的CAD安装后无法打开,安装过程中没有出现任何问题,但是安装后打开就出现一个对话框“DBXCAS0”点击后又出现“FATALERROR:UnhandledAccessViola...
- 腾讯QQ6.1正式版发布更新
-
2014-07-2405:12:00作者:张林【中关村在线软件资讯】7月24日消息:腾讯QQ官网小幅更新了QQ6.1正式版,最新版本号升级至11905,继续主打扁平化、炫酷登录窗口、支持同步最近一...
- Win10等网页版OneDrive无法登陆怎么办?
-
IT之家(www.ithome.com):Win10等网页版OneDrive无法登陆怎么办?Win10之家报道,微软OneDrive云网盘是跨平台的数据同步和存储服务,支持WindowsPC(如Wi...
- 经典回顾:折戟沉沙的Windows Longhorn有着惊艳的登录屏幕
-
尽管微软原先计划让WindowsLonghorn继承WindowsXP操作系统的衣钵,但这个充满雄心壮志的操作系统项目最终还是未能迎来曙光,而是被微软用WindowsVista取而代...
- 电脑怎么优化
-
电脑配置和宽带流量也是硬件,但这些要求其实并不需要很高,关键还是怎么去安全使用电脑并进行有效的优化。电脑的应用和优化处理一、电脑的应用和优化处理二、目前,大家使用的个人电脑,配置方面均没多大问题,比如...
- 怎么安装usb驱动
-
USB驱动主要是针对WIN98时代的说法,如今WINXP已集成大部分USB驱动,通常都能识别。只有极少数情况下,例如手机、打印机或扫描仪等办公设备的USB驱动可能无法自动识别。1、USB驱动偶尔无法...
- 普通话考试多名考生信息被泄露,接投诉后涉事网站被限制访问
-
“陕西普通话成绩查询网(sxpth.cn)”泄露个人信息网站截图网传图片显示,407名普通话考试考生的姓名、身份证号码等个人信息疑似被泄露。9月26日下午,涉事网站sxpth.cn的域名注册商——成...
- 电脑伪技巧——个人电脑无需设置登录密码
-
默认情况下,我们每次登录系统都要输入登录账户对应的密码才能进入桌面。有些朋友觉得这样很麻烦,由于电脑只是自己使用,还不如不要设置密码,这样每次可以自动登录。大家知道,账户密码是系统验证用户合法性的唯一...
- Windows 10/11 自带远程桌面:实用技巧与操作指南
-
Windows10/11自带远程桌面:实用技巧与操作指南在当今快节奏的数字时代,远程访问和控制计算机的需求日益增长。微软在Windows10和Windows11中内置了远程桌面功能,为用户提供...
- 不升级系统的5大原因造吗?
-
2015-01-2405:54:00作者:陈占伟Windows10系统的发布,让人们重新将目光聚焦到生命力长久的Windows系统之上。如今操作系统越来越多,似乎Windows升级的获得的关注度...
你 发表评论:
欢迎- 一周热门
- 最近发表
- 标签列表
-
- 如何绘制折线图 (52)
- javaabstract (48)
- 新浪微博头像 (53)
- grub4dos (66)
- s扫描器 (51)
- httpfile dll (48)
- ps实例教程 (55)
- taskmgr (51)
- s spline (61)
- vnc远程控制 (47)
- 数据丢失 (47)
- wbem (57)
- flac文件 (72)
- 网页制作基础教程 (53)
- 镜像文件刻录 (61)
- ug5 0软件免费下载 (78)
- debian下载 (53)
- ubuntu10 04 (60)
- web qq登录 (59)
- 笔记本变成无线路由 (52)
- flash player 11 4 (50)
- 右键菜单清理 (78)
- cuteftp 注册码 (57)
- ospf协议 (53)
- ms17 010 下载 (60)