举例说明什么是抽象类!让抽象变的不再抽象??!

欢迎Java工程师关注简书专栏
Java架构技术进阶
本专栏收录各种Java相关技术,面试题,以及学习感悟,心得!

抽象类之所以比较难理解,大概就是因为他太抽象了吧,哈哈,这好像是废话。。

虽然很早之前就知道这个抽象类的概念,但是一直纠结于一个问题:你这个抽象类在实际开发过程中到底有个毛线用??

所以呢,今天想通过一个例子,来彻底搞清楚这家伙在实际开发中的作用??!

假设我是一个地下城的鬼剑士玩家,通过游戏可以实现以下功能

  1. 我的鬼剑士一次只能放一个技能
  2. 我的鬼剑士有很多技能
  3. 我可以通过技能键选择释放哪个技能
  4. 我可以用技能打怪(打怪释放技能音效)

先来看不需要抽象类的实现方式:

第一步:定义技能?。?/p>

假设我现在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,还不错可以顶得?。。?/p>

But,当我刚改好代码,那些大佬们一秒999级,这时候,老板让我赶紧给鬼剑士添加100个技能。

我瞬间一个晴天霹雳?。?/p>

这时候,一直偷偷爱慕我的香蕉君教给我了一个新技能——抽象类??!

于是,我用新的思想开始了抽象之旅:

第一步:定义技能

首先,定义一个抽象类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!!!");
    }
}

所以呢,有了抽象类后只需要添加抽象类的下属的类即可,别的压根不用改,这一下子省了多少工夫?。。?!

最后编辑于
?著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,029评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,238评论 3 388
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事?!?“怎么了?”我有些...
    开封第一讲书人阅读 159,576评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,214评论 1 287
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,324评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,392评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,416评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,196评论 0 269
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,631评论 1 306
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,919评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,090评论 1 342
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,767评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,410评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,090评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,328评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,952评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,979评论 2 351

推荐阅读更多精彩内容

  • 多去外面走走是件挺不错的事儿,但是去之前一定要多学习,准确的说是任何时候都要学习,不然会很尴尬滴!
    回忆里的mangder阅读 236评论 0 0
  • 大家好!我是一棵小草。我的故乡是农村,我一直向往着大城市,今天,我终于来到了大城市。 我和其他小伙伴一起躺在花盆里...
    马文博tt阅读 118评论 0 0
  • 急骤的雨打在 热腾的尘土上 打湿斑驳的锈 和老旧的门 刚好碰到了你 撑着一把小伞 踢踏迈着步子 脸上带着笑 如果走...
    游鱼寒石阅读 150评论 0 0
  • 【章节】猫叔分享变现进阶课程 【字数】637 【标题】维系用户三大心法,值得你持续做 我要成为支撑领域的行家。在行...
    Jerry_雨中的梦阅读 196评论 0 0