golang沒有抽象類。golang并不是面向?qū)ο螅∣OP)語言,沒有類和繼承的概念,也沒有抽象類的概念;但golang中有結(jié)構(gòu)體(struct)和接口(interface),可以通過struct和interface的組合來間接實現(xiàn)面向?qū)ο笳Z言中的抽象類。
本教程操作環(huán)境:windows7系統(tǒng)、GO 1.18版本、Dell G3電腦。
在 Java 這種面向?qū)ο蟮恼Z言中,抽象類和接口是我們經(jīng)常會運用到的 2 種對抽象概念進行定義的機制。在 golang 中,沒有類和繼承的概念。golang 中有結(jié)構(gòu)體(struct),和面向?qū)ο笳Z言中的類相似。golang 中也有接口(interface),接口可以定義一組不含有具體實現(xiàn)的方法,其提供了一種方式來說明對象的行為。
然而,在某些情況下,我們需要使用抽象類繼承,來幫助我們寫出更優(yōu)雅的代碼??墒窃?golang 中又沒有抽象類的概念,本文將介紹一種通過 struct 和 interface 來在 golang 中實現(xiàn)抽象類的方法。
Golang中怎么實現(xiàn)抽象類
下面我們會用 Java 語言作為示例,來看看如何在面向?qū)ο笳Z言中實現(xiàn)抽象類。接著換 golang 語言,通過 struct 和 interface 來實現(xiàn)抽象類,完成相同的功能。
面向?qū)ο笳Z言中抽象類的實現(xiàn)
假設(shè)我們需要實現(xiàn)下面這樣的幾個類(使用 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"; } }
我們定義了 Game 抽象類,在此類中定義了 public abstract String name(); 一個抽象方法和 public void play() 這樣一個公開方法。然后我們定義了 Dota 和 LOL 2個類去繼承 Game,并各自實現(xiàn)了 public String name()。
接下來讓我們看看如何在 golang 中實現(xiàn)抽象類。
golang 中實現(xiàn)抽象類的方式
-
定義 interface
首先,我們需要將抽象方法定義在 interface 中。
type IGame interface { Name() string }
-
定義”父類”
然后,我們需要使用 struct 實現(xiàn)公共方法。
type Game struct {} func (g *Game) play(game IGame) { fmt.Printf(fmt.Sprintf("%s is awesome!", game.Name())) }
這里是重點,我們將 game IGame
傳了進來。這樣我們便可以調(diào)用”子類”的方法來獲取名字。從而間接地實現(xiàn)了在公共方法中調(diào)用不同”子類”的實現(xiàn)的抽象方法。
-
定義”子類”
接著,我們再定義”Dota”和”LOL”這 2 個 struct 即可。
type Dota struct { Game } func (d *Dota) Name() string { return "Dota" } type LOL struct { Game } func (l *LOL) Name() string { return "LOL" }
-
大功告成
現(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!
總結(jié)
本文通過 struct 和 interface 的組合,提供了一種思路,間接實現(xiàn)了面向?qū)ο笳Z言中的抽象類繼承的模式。
【