站長資訊網(wǎng)
最全最豐富的資訊網(wǎng)站

golang是否有抽象類

golang沒有抽象類。golang并不是面向?qū)ο螅∣OP)語言,沒有類和繼承的概念,也沒有抽象類的概念;但golang中有結(jié)構(gòu)體(struct)和接口(interface),可以通過struct和interface的組合來間接實(shí)現(xiàn)面向?qū)ο笳Z言中的抽象類。

golang是否有抽象類

本教程操作環(huán)境:windows7系統(tǒng)、GO 1.18版本、Dell G3電腦。

在 Java 這種面向?qū)ο蟮恼Z言中,抽象類和接口是我們經(jīng)常會(huì)運(yùn)用到的 2 種對(duì)抽象概念進(jìn)行定義的機(jī)制。在 golang 中,沒有類和繼承的概念。golang 中有結(jié)構(gòu)體(struct),和面向?qū)ο笳Z言中的類相似。golang 中也有接口(interface),接口可以定義一組不含有具體實(shí)現(xiàn)的方法,其提供了一種方式來說明對(duì)象的行為。

然而,在某些情況下,我們需要使用抽象類繼承,來幫助我們寫出更優(yōu)雅的代碼。可是在 golang 中又沒有抽象類的概念,本文將介紹一種通過 struct 和 interface 來在 golang 中實(shí)現(xiàn)抽象類的方法。

Golang中怎么實(shí)現(xiàn)抽象類

下面我們會(huì)用 Java 語言作為示例,來看看如何在面向?qū)ο笳Z言中實(shí)現(xiàn)抽象類。接著換 golang 語言,通過 struct 和 interface 來實(shí)現(xiàn)抽象類,完成相同的功能。

面向?qū)ο笳Z言中抽象類的實(shí)現(xiàn)

假設(shè)我們需要實(shí)現(xiàn)下面這樣的幾個(gè)類(使用 Java 為例):

public abstract class Game {     public void play()     {         System.out.println(this.name() + " is awesome!");     }     public abstract String name(); } public class Dota extends Game {     public String name()     {         return "Dota";     } } public class LOL extends Game {     public String name()     {         return "LOL";     } }
登錄后復(fù)制

我們定義了 Game 抽象類,在此類中定義了 public abstract String name(); 一個(gè)抽象方法和 public void play() 這樣一個(gè)公開方法。然后我們定義了 Dota 和 LOL 2個(gè)類去繼承 Game,并各自實(shí)現(xiàn)了 public String name()。

接下來讓我們看看如何在 golang 中實(shí)現(xiàn)抽象類。

golang 中實(shí)現(xiàn)抽象類的方式

  • 定義 interface

首先,我們需要將抽象方法定義在 interface 中。

type IGame interface { 	Name() string }
登錄后復(fù)制

  • 定義”父類”

然后,我們需要使用 struct 實(shí)現(xiàn)公共方法。

type Game struct {} func (g *Game) play(game IGame) { 	fmt.Printf(fmt.Sprintf("%s is awesome!", game.Name())) }
登錄后復(fù)制

這里是重點(diǎn),我們將 game IGame 傳了進(jìn)來。這樣我們便可以調(diào)用”子類”的方法來獲取名字。從而間接地實(shí)現(xiàn)了在公共方法中調(diào)用不同”子類”的實(shí)現(xiàn)的抽象方法。

  • 定義”子類”

接著,我們再定義”Dota”和”LOL”這 2 個(gè) struct 即可。

type Dota struct {     Game } func (d *Dota) Name() string { 	return "Dota" } type LOL struct {     Game } func (l *LOL) Name() string { 	return "LOL" }
登錄后復(fù)制

  • 大功告成

現(xiàn)在,在初始化”Dota”和”LOL”結(jié)構(gòu)體后,便可以調(diào)用 func (g *Game) play(game IGame) 方法了。

dota := &Dota{} dota.play(dota)  lol := &LOL{} lol.play(lol)  // 輸出: //Dota is awesome! //LOL is awesome!
登錄后復(fù)制

總結(jié)

本文通過 struct 和 interface 的組合,提供了一種思路,間接實(shí)現(xiàn)了面向?qū)ο笳Z言中的抽象類繼承的模式。

贊(0)
分享到: 更多 (0)
網(wǎng)站地圖   滬ICP備18035694號(hào)-2    滬公網(wǎng)安備31011702889846號(hào)
日韩在线视频一区二区三区| 国产一区二区精品久久| 99精品视频在线观看免费播放 | 精品香蕉伊思人在线观看| 91精品福利视频| 国产A√精品区二区三区四区| 69久久精品无码一区二区| 久久99热这里只有精品国产| 精品国产一区二区三区av片| 日韩人妻无码精品久久免费一| 日韩不卡视频在线| 国内精品videofree720 | 久热这里只精品99国产6_99| 亚洲欧洲日韩国产综合在线二区| 91精品国产高清久久久久久91| 久久精品中文字幕有码| 国产精品国产高清国产av| 2020国产精品永久在线观看| 97r久久精品国产99国产精| 国产日韩精品SUV| 含羞草国产亚洲精品岁国产精品| 亚洲精品国产成人专区| 中日韩精品电影推荐网站| 日韩精品成人一区二区三区| 国产亚洲精品VA片在线播放| 久久精品乱子伦免费| 成人区人妻精品一区二区不卡网站 | 日韩精品一区二区亚洲AV观看| 97久久精品无码一区二区天美| 久久精品国产99精品国产亚洲性色| 国产精品成人观看视频| 亚洲日韩一页精品发布| 色婷婷99综合久久久精品| 精品女同一区二区三区免费站| 久久中文字幕2021精品| 97久久精品午夜一区二区| 午夜精品一区二区三区在线视| 日韩电影免费在线观看中文字幕 | 精品视频一区二区观看| 国产精品VA在线播放| 精品69久久久久久99|