舉例說(shuō)明什么是抽象類!讓抽象變的不再抽象Q镣恕闰靴!

歡迎Java工程師關(guān)注簡(jiǎn)書專欄
Java架構(gòu)技術(shù)進(jìn)階
本專欄收錄各種Java相關(guān)技術(shù),面試題钻注,以及學(xué)習(xí)感悟蚂且,心得!

抽象類之所以比較難理解幅恋,大概就是因?yàn)樗橄罅税尚铀溃@好像是廢話。淑翼。

雖然很早之前就知道這個(gè)抽象類的概念腐巢,但是一直糾結(jié)于一個(gè)問(wèn)題:你這個(gè)抽象類在實(shí)際開(kāi)發(fā)過(guò)程中到底有個(gè)毛線用?玄括?

所以呢冯丙,今天想通過(guò)一個(gè)例子,來(lái)徹底搞清楚這家伙在實(shí)際開(kāi)發(fā)中的作用T饩胃惜!

假設(shè)我是一個(gè)地下城的鬼劍士玩家,通過(guò)游戲可以實(shí)現(xiàn)以下功能

  1. 我的鬼劍士一次只能放一個(gè)技能
  2. 我的鬼劍士有很多技能
  3. 我可以通過(guò)技能鍵選擇釋放哪個(gè)技能
  4. 我可以用技能打怪(打怪釋放技能音效)

先來(lái)看不需要抽象類的實(shí)現(xiàn)方式:

第一步:定義技能D牡瘛船殉!

假設(shè)我現(xiàn)在5級(jí),有兩個(gè)技能分別是上挑(Up)和鬼斬(Kill)热监,那我現(xiàn)在定義這兩個(gè)技能:

public class Up
    {
    public void Speak()
            {
        // 上挑音效
        Console.WriteLine("嘿!!!");
    }
}
public class Kill
    {
    public void Speak()
            {
        // 鬼斬音效
        Console.WriteLine("哈!!!");
    }
}

第二部:定義鬼劍士^嘞摇!

大街上一堆角色孝扛,不同的角色有不同的屬性,所以呢幽崩,會(huì)上挑和鬼斬的才能使鬼戰(zhàn)士苦始。

public class Swordsman
    {
    // 對(duì)應(yīng)的兩個(gè)技能
    private Up up;
    private Kill kill;
    // 選擇釋放哪個(gè)技能
    public void Select(object skill)
            {
        if (skill is Up)
                    {
            up = (Up)skill;
            kill = null;
        } else
                    {
            kill = (Kill)skill;
            up = null;
        }
    }
    // 釋放不同的技能對(duì)應(yīng)著不同的釋放音效
    public void Hit()
            {
        Console.WriteLine("開(kāi)始打怪!!");
        if(kill==null)
                    {
            up.Speak();
        } else
                    {
            kill.Speak();
        }
    }
}

第三部:實(shí)例化一個(gè)鬼劍士,大街上全是鬼劍士慌申,只有ID是我的名字的那個(gè)鬼劍士才是我的鬼劍士陌选。

class Program
    {
    static void Main(string[] args)
            {
        // 實(shí)例化一個(gè)鬼劍士旭旭寶寶
        Swordsman xuxubaobao = new Swordsman();
        // 旭旭寶寶選擇使用上挑并釋放出去
        xuxubaobao.Select(new Up());
        xuxubaobao.Hit();
        // 旭旭寶寶選擇使用鬼斬并釋放出去
        xuxubaobao.Select(new Kill());
        xuxubaobao.Hit();
    }
}

沒(méi)問(wèn)題,一切都是那么的美好L愀取咨油!大佬們玩的開(kāi)心,我們程序員也露出了微笑柒爵。

ButR鄣纭!由于玩家們都是土豪棉胀,瞬間升到10級(jí)法瑟,老板們就督促程序員添加一個(gè)新技能崩天擊(Knock)。

老夫一想唁奢,沒(méi)問(wèn)題霎挟,就開(kāi)始搞了。

以下是修改過(guò)程:

第一步:老夫定義一個(gè)新技能的類崩天擊(Knock)

public class Knock
    {
    public void Speak()
            {
        // 崩天擊音效
        Console.WriteLine("oh yeah !!!");
    }
}

第二步:老夫修改了Swordsman類

public class Swordsman
    {
    // 對(duì)應(yīng)的兩個(gè)技能
    private Up up;
    private Kill kill;
    private Knock knock;
    // 選擇釋放哪個(gè)技能
    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;
        }
    }
    // 釋放不同的技能對(duì)應(yīng)著不同的釋放音效
    public void Hit()
            {
        Console.WriteLine("開(kāi)始打怪!!");
        if(kill==null)
                    {
            up.Speak();
        } else if
                    {
            kill.Speak();
        } else
                    {
            knock.Speck();
        }
    }
}

OK麻掸!

從上面可以看出酥夭,老夫?yàn)榱诵绿砑右粋€(gè)技能,在Swordsman類里新加了一個(gè)字段knock,在選擇技能和釋放技能處分別多加了一個(gè)else if熬北,還不錯(cuò)可以頂?shù)米千所。。?/p>

But蒜埋,當(dāng)我剛改好代碼淫痰,那些大佬們一秒999級(jí),這時(shí)候整份,老板讓我趕緊給鬼劍士添加100個(gè)技能待错。

我瞬間一個(gè)晴天霹靂!烈评!

這時(shí)候火俄,一直偷偷愛(ài)慕我的香蕉君教給我了一個(gè)新技能——抽象類!讲冠!

于是瓜客,我用新的思想開(kāi)始了抽象之旅:

第一步:定義技能

首先,定義一個(gè)抽象類AbstractSkill竿开。老夫把什么上挑谱仪、鬼斬、崩天擊否彩、大吸全都抽象成一個(gè)類疯攒,名為AbstractSkill,同時(shí)里面存在一個(gè)技能音效的方法列荔,但是釋放的是什么音效呢敬尺?答案是沒(méi)有音效。

public abstract class AbstractSkill
        {
    public abstract void Speak();
}

每一個(gè)具體的技能都繼承至這個(gè)抽象類(override是將繼承至AbstractSkill中的方法進(jìn)行重寫 -- 也就是給每個(gè)技能重新添加了音效):

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 !!!");
    }
}

第二部:定義鬼劍士贴浙。

這時(shí)候我重新定義了鬼劍士(恩砂吞?? 代碼好像少了點(diǎn)):

public class Swordsman
        {
    private AbstractSkill skill;
    public Swordsman() {
    }
    public void Select(AbstractSkill skill)
                {
        this.skill = skill;
    }
    public void Hit()
                {
        skill.Speak();
    }
}

第三部:實(shí)例化一個(gè)鬼劍士并放了三個(gè)技能崎溃。

class Program
    {
    static void Main(string[] args)
            {
        // 實(shí)例化一個(gè)鬼劍士旭旭寶寶
        Swordsman xuxubaobao = new Swordsman();
        // 旭旭寶寶選擇使用上挑并釋放出去
        xuxubaobao.Select(new Up());
        xuxubaobao.Hit();
        // 旭旭寶寶選擇使用鬼斬并釋放出去
        xuxubaobao.Select(new Kill());
        xuxubaobao.Hit();
        // 旭旭寶寶選擇使用崩天擊并釋放出去
        xuxubaobao.Select(new Knock());
        xuxubaobao.Hit();
    }
}

這時(shí)候已經(jīng)改好代碼了蜻直,如果老夫想在加新的技能的話,直接定義一個(gè)新的技能類并繼承于抽象類AbstractSkill:例如(小吸:Suck)

public class Suck:AbstractSkill
    {
    public override void Speak()
            {
        // 小吸音效
        Console.WriteLine("oh oh oh!!!");
    }
}

所以呢笨奠,有了抽象類后只需要添加抽象類的下屬的類即可袭蝗,別的壓根不用改,這一下子省了多少工夫鞍闫拧5叫取!蔚袍!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末乡范,一起剝皮案震驚了整個(gè)濱河市配名,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌晋辆,老刑警劉巖渠脉,帶你破解...
    沈念sama閱讀 219,539評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異瓶佳,居然都是意外死亡芋膘,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,594評(píng)論 3 396
  • 文/潘曉璐 我一進(jìn)店門霸饲,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)为朋,“玉大人,你說(shuō)我怎么就攤上這事厚脉∠按纾” “怎么了?”我有些...
    開(kāi)封第一講書人閱讀 165,871評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵傻工,是天一觀的道長(zhǎng)霞溪。 經(jīng)常有香客問(wèn)我,道長(zhǎng)中捆,這世上最難降的妖魔是什么鸯匹? 我笑而不...
    開(kāi)封第一講書人閱讀 58,963評(píng)論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮轨香,結(jié)果婚禮上忽你,老公的妹妹穿的比我還像新娘。我一直安慰自己臂容,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,984評(píng)論 6 393
  • 文/花漫 我一把揭開(kāi)白布根蟹。 她就那樣靜靜地躺著脓杉,像睡著了一般。 火紅的嫁衣襯著肌膚如雪简逮。 梳的紋絲不亂的頭發(fā)上球散,一...
    開(kāi)封第一講書人閱讀 51,763評(píng)論 1 307
  • 那天,我揣著相機(jī)與錄音散庶,去河邊找鬼蕉堰。 笑死,一個(gè)胖子當(dāng)著我的面吹牛悲龟,可吹牛的內(nèi)容都是我干的屋讶。 我是一名探鬼主播,決...
    沈念sama閱讀 40,468評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼须教,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼皿渗!你這毒婦竟也來(lái)了斩芭?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書人閱讀 39,357評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤乐疆,失蹤者是張志新(化名)和其女友劉穎划乖,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體挤土,經(jīng)...
    沈念sama閱讀 45,850評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡琴庵,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,002評(píng)論 3 338
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了仰美。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片迷殿。...
    茶點(diǎn)故事閱讀 40,144評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖筒占,靈堂內(nèi)的尸體忽然破棺而出贪庙,到底是詐尸還是另有隱情,我是刑警寧澤翰苫,帶...
    沈念sama閱讀 35,823評(píng)論 5 346
  • 正文 年R本政府宣布止邮,位于F島的核電站,受9級(jí)特大地震影響奏窑,放射性物質(zhì)發(fā)生泄漏导披。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,483評(píng)論 3 331
  • 文/蒙蒙 一埃唯、第九天 我趴在偏房一處隱蔽的房頂上張望撩匕。 院中可真熱鬧,春花似錦墨叛、人聲如沸止毕。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 32,026評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)扁凛。三九已至,卻和暖如春闯传,著一層夾襖步出監(jiān)牢的瞬間谨朝,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 33,150評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工甥绿, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留字币,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,415評(píng)論 3 373
  • 正文 我出身青樓共缕,卻偏偏與公主長(zhǎng)得像洗出,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子骄呼,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,092評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容

  • 多去外面走走是件挺不錯(cuò)的事兒共苛,但是去之前一定要多學(xué)習(xí)判没,準(zhǔn)確的說(shuō)是任何時(shí)候都要學(xué)習(xí),不然會(huì)很尷尬滴隅茎!
    回憶里的mangder閱讀 239評(píng)論 0 0
  • 大家好澄峰!我是一棵小草。我的故鄉(xiāng)是農(nóng)村辟犀,我一直向往著大城市俏竞,今天,我終于來(lái)到了大城市堂竟。 我和其他小伙伴一起躺在花盆里...
    馬文博tt閱讀 120評(píng)論 0 0
  • 急驟的雨打在 熱騰的塵土上 打濕斑駁的銹 和老舊的門 剛好碰到了你 撐著一把小傘 踢踏邁著步子 臉上帶著笑 如果走...
    游魚寒石閱讀 150評(píng)論 0 0
  • 【章節(jié)】貓叔分享變現(xiàn)進(jìn)階課程 【字?jǐn)?shù)】637 【標(biāo)題】維系用戶三大心法出嘹,值得你持續(xù)做 我要成為支撐領(lǐng)域的行家席楚。在行...
    Jerry_雨中的夢(mèng)閱讀 197評(píng)論 0 0