從0開始學(xué)GO設(shè)計(jì)模式-繼承抽象類

首先聲明下go 沒(méi)有繼承葱她,沒(méi)有繼承撩扒,沒(méi)有繼承,重要事情說(shuō)三遍吨些。但是他又能實(shí)現(xiàn)繼承搓谆,通過(guò)一個(gè)神奇的東西 - 結(jié)構(gòu)體。

那么抽象類的使用場(chǎng)景是什么呢豪墅?

  • 定義了一組接口泉手,但又不想強(qiáng)迫每個(gè)實(shí)現(xiàn)類都必須實(shí)現(xiàn)所有的接口∨计鳎可以用abstract class定義一組方法體螃诅,甚至可以是空方法體啡氢,然后由子類選擇自己所感興趣的方法來(lái)覆蓋。

  • 某些場(chǎng)合下术裸,只靠純粹的接口不能滿足類與類之間的協(xié)調(diào),還必需類中表示狀態(tài)的變量來(lái)區(qū)別不同的關(guān)系亭枷。abstract的中介作用可以很好地滿足這一點(diǎn)袭艺。

  • 規(guī)范了一組相互協(xié)調(diào)的方法,其中一些方法是共同的叨粘,與狀態(tài)無(wú)關(guān)的猾编,可以共享的,無(wú)需子類分別實(shí)現(xiàn)升敲;而另一些方法卻需要各個(gè)子類根據(jù)自己特定的狀態(tài)來(lái)實(shí)現(xiàn)特定的功能

說(shuō)人話就是:規(guī)范了執(zhí)行方法答倡,想覆蓋就重寫,不想覆蓋就用父類的就好了

在這些情況下驴党,我們需要使用抽象類繼承瘪撇,來(lái)幫助我們寫出更優(yōu)雅的代碼「圩可是在 golang 中又沒(méi)有抽象類的概念倔既,哪有如何呢?
那不得不介紹一種通過(guò) struct 和 interface 來(lái)在 golang 中實(shí)現(xiàn)抽象類的方法鹏氧。

因?yàn)間o 里面沒(méi)有extends abstract 這些關(guān)鍵字渤涌,那么先從大家所熟悉的主流語(yǔ)言java 來(lái)引入一段代碼

java實(shí)現(xiàn)抽象類

1.創(chuàng)建抽象父類

package abstractModel;

public abstract class CatAbstract {

    public abstract void steeringWheel();
    public void run(){
        System.out.println("我是父類方法-run,大家一起跑起來(lái)~");
    }
}

我創(chuàng)建了一個(gè)公共的方法run或者換一種名字叫做默認(rèn)方法
另外創(chuàng)建一個(gè)抽象方法steeringWheel把还,子類都需要實(shí)現(xiàn)的

2.創(chuàng)建2個(gè)子類
第一個(gè)aodi的

package abstractModel;

public class Audi extends CatAbstract{
    @Override
    public void steeringWheel() {
        System.out.println("我是奧迪的方向盤");
    }
}

第二個(gè)benchi的

package abstractModel;

public class Benz extends CatAbstract{
    @Override
    public void steeringWheel() {
        System.out.println("我是奔馳的方向盤");
    }

    @Override
    public void run() {
        System.out.println("我奔馳nb  有自己的方式跑起來(lái)");
    }
}

運(yùn)行如下

package abstractModel;

public class AbstractMain {

    public static void main(String[] args) {
        Audi audi = new Audi();
        audi.steeringWheel();
        audi.run();

        System.out.println("-----華麗分界線----");

        Benz benz = new Benz();
        benz.steeringWheel();
        benz.run();
    }
}
image.png

只要重寫了父類那么就用子類的实蓬,沒(méi)實(shí)現(xiàn)就用父類的,抽象方法一定要在子類實(shí)現(xiàn)吊履。
好了安皱,現(xiàn)在咱們用go 來(lái)實(shí)現(xiàn)這段java代碼

Go 實(shí)現(xiàn)抽象類

先來(lái)實(shí)現(xiàn)第一個(gè)父類

package abstractClass

import "fmt"

type CatAbstract struct {
    ICatAbstract
}

type ICatAbstract interface {
    SteeringWheel()
    Run1()
}

func (c *CatAbstract) Run1() {
    fmt.Println("我是父類方法-run,大家一起跑起來(lái)~")
}

創(chuàng)建一個(gè)interface 里面同樣有2個(gè)方法率翅。這2個(gè)方法放到這里练俐,起子類可以都來(lái)實(shí)現(xiàn)它,假如有一個(gè)默認(rèn)的方法run1冕臭,那咱就默認(rèn)把它給實(shí)現(xiàn)了腺晾,那么他就不是一個(gè)抽象方法了,其實(shí)go里面壓根就沒(méi)這個(gè)東西辜贵,咱們是為了實(shí)現(xiàn)它悯蝉,而臨時(shí)定義的名字叫做抽象方法,記住go里萬(wàn)物皆結(jié)構(gòu)體托慨,比php萬(wàn)物皆數(shù)據(jù)更強(qiáng)大(對(duì)go這種語(yǔ)言寫設(shè)計(jì)模式代碼鼻由,真的蛋疼)

創(chuàng)建2個(gè)子類

package abstractClass

import "fmt"

type Audi struct {
    CatAbstract
}

func (a *Audi) SteeringWheel() {
    fmt.Println("我是奧迪的方向盤")
}

定義的第一個(gè)類audi咱們就實(shí)現(xiàn)一個(gè)”抽象方法“ SteeringWheel
在創(chuàng)建另一個(gè)benz

package abstractClass

import "fmt"

type Benz struct {
    CatAbstract
}

func (b *Benz) SteeringWheel() {
    fmt.Println("我是奔馳的方向盤")
}

func (b *Benz) Run1() {
    fmt.Println("我奔馳nb  有自己的方式跑起來(lái)")
}

它就很聰明的實(shí)現(xiàn)了2個(gè)
看效果

package abstractClass

import (
    "fmt"
    "testing"
)

func TestAbstractClass(t *testing.T) {

    audi := &Audi{}
    audi.SteeringWheel()
    audi.Run1()

    fmt.Println("-----華麗分界線----")

    benz := &Benz{}
    benz.SteeringWheel()
    benz.Run1()
}
image.png

到這里就結(jié)束了,go沒(méi)有繼承,萬(wàn)物皆結(jié)構(gòu)體蕉世,請(qǐng)不要用其他語(yǔ)言的編程思想來(lái)寫go蔼紧,不然就是對(duì)自己的折磨。

請(qǐng)記住go沒(méi)有繼承狠轻,萬(wàn)物皆結(jié)構(gòu)體
go 起來(lái)吧奸例!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市向楼,隨后出現(xiàn)的幾起案子查吊,更是在濱河造成了極大的恐慌,老刑警劉巖湖蜕,帶你破解...
    沈念sama閱讀 217,406評(píng)論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件逻卖,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡昭抒,警方通過(guò)查閱死者的電腦和手機(jī)评也,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,732評(píng)論 3 393
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)戈鲁,“玉大人仇参,你說(shuō)我怎么就攤上這事∑诺睿” “怎么了诈乒?”我有些...
    開封第一講書人閱讀 163,711評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)婆芦。 經(jīng)常有香客問(wèn)我怕磨,道長(zhǎng),這世上最難降的妖魔是什么消约? 我笑而不...
    開封第一講書人閱讀 58,380評(píng)論 1 293
  • 正文 為了忘掉前任肠鲫,我火速辦了婚禮,結(jié)果婚禮上或粮,老公的妹妹穿的比我還像新娘导饲。我一直安慰自己,他們只是感情好氯材,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,432評(píng)論 6 392
  • 文/花漫 我一把揭開白布渣锦。 她就那樣靜靜地躺著,像睡著了一般氢哮。 火紅的嫁衣襯著肌膚如雪袋毙。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,301評(píng)論 1 301
  • 那天冗尤,我揣著相機(jī)與錄音听盖,去河邊找鬼胀溺。 笑死,一個(gè)胖子當(dāng)著我的面吹牛皆看,可吹牛的內(nèi)容都是我干的仓坞。 我是一名探鬼主播,決...
    沈念sama閱讀 40,145評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼悬蔽,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼扯躺!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起蝎困,我...
    開封第一講書人閱讀 39,008評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎倍啥,沒(méi)想到半個(gè)月后禾乘,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,443評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡虽缕,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,649評(píng)論 3 334
  • 正文 我和宋清朗相戀三年始藕,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片氮趋。...
    茶點(diǎn)故事閱讀 39,795評(píng)論 1 347
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡伍派,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出剩胁,到底是詐尸還是另有隱情诉植,我是刑警寧澤,帶...
    沈念sama閱讀 35,501評(píng)論 5 345
  • 正文 年R本政府宣布昵观,位于F島的核電站晾腔,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏啊犬。R本人自食惡果不足惜灼擂,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,119評(píng)論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望觉至。 院中可真熱鬧剔应,春花似錦、人聲如沸语御。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,731評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)沃暗。三九已至月洛,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間孽锥,已是汗流浹背嚼黔。 一陣腳步聲響...
    開封第一講書人閱讀 32,865評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工细层, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人唬涧。 一個(gè)月前我還...
    沈念sama閱讀 47,899評(píng)論 2 370
  • 正文 我出身青樓疫赎,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親碎节。 傳聞我的和親對(duì)象是個(gè)殘疾皇子捧搞,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,724評(píng)論 2 354

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