主頁(yè) > 知識(shí)庫(kù) > Golang的繼承模擬實(shí)例

Golang的繼承模擬實(shí)例

熱門(mén)標(biāo)簽:電腦外呼系統(tǒng)輻射大嗎 開(kāi)通400電話申請(qǐng)流程 上海企業(yè)外呼系統(tǒng)排名 揚(yáng)州電銷外呼系統(tǒng)軟件 如何利用高德地圖標(biāo)注家 400手機(jī)電話免費(fèi)辦理 武漢百應(yīng)人工智能電銷機(jī)器人 智能語(yǔ)音電銷的機(jī)器人 百度地圖標(biāo)注位置網(wǎng)站

1.前言

面向?qū)ο缶幊痰娜筇匦裕悍庋b、繼承、多態(tài)??梢?jiàn)繼承是面向?qū)ο蟪绦蛟O(shè)計(jì)中一個(gè)重要的概念。Go 作為面向?qū)ο蟮木幊陶Z(yǔ)言,自然也支持繼承。

比較特殊的是 Go 實(shí)現(xiàn)繼承的方式與其他傳統(tǒng) OOP 語(yǔ)言所有不同,不像 C++ 有專門(mén)的繼承語(yǔ)法,或者像 Java 中有專門(mén)的關(guān)鍵字 extends。

C++ 的繼承:

// 基類
class Animal {
public:
    void eat(); 
	void sleep();
};


// 子類
class Dog : public Animal {
public:
    void bark();
};

Java 的繼承:

// 基類
public class Animal {
	public void eat(){};
	public void sleep(){};
}
// 子類
public class Dog extends Animal {
	public void bark(){};
}

2.嵌入式繼承機(jī)制

Go 使用匿名嵌套實(shí)現(xiàn)繼承。

我們用很容易理解的動(dòng)物-貓來(lái)舉例子。

type Animal struct {
	Name string
}
func (a *Animal) Eat() {
	fmt.Printf("%v is eating", a.Name)
	fmt.Println()
}
type Cat struct {
	Animal
}
cat := Cat{
	Animal: Animal{
		Name: "cat",
	},
}
cat.Eat() // cat is eating

首先,我們實(shí)現(xiàn)了一個(gè) Animal 的結(jié)構(gòu)體,代表動(dòng)物類。并聲明了 Name 字段,用于描述動(dòng)物的名字。

然后,實(shí)現(xiàn)了一個(gè)以 Animal 為 receiver 的 Eat 方法,來(lái)描述動(dòng)物進(jìn)食的行為。

最后,聲明了一個(gè) Cat 結(jié)構(gòu)體,組合了 Cat 字段。再實(shí)例化一個(gè)貓,調(diào)用Eat方法,可以看到會(huì)正常的輸出。

可以看到,Cat 結(jié)構(gòu)體本身沒(méi)有 Name 字段,也沒(méi)有去實(shí)現(xiàn) Eat() 方法。唯一有的就是匿名嵌套的方式繼承了 Animal 父類,至此,我們證明了 Go 通過(guò)匿名嵌套的方式實(shí)現(xiàn)了繼承。

上面是嵌入類型實(shí)例,同樣地也可以嵌入類型指針。

type Cat struct {
	*Animal
}
cat := Cat{
	Animal: Animal{
		Name: "cat",
	},
}

3.嵌入式繼承機(jī)制的的局限

相比于 C++ 和 Java, Go 的繼承機(jī)制的作用是非常有限的,因?yàn)闆](méi)有抽象方法,有很多的設(shè)計(jì)方案可以在 C++ 和 Java 中輕松實(shí)現(xiàn),但是 Go 的繼承卻不能完成同樣的工作。

package main
import "fmt"
// Animal 動(dòng)物基類
type Animal struct {
	name string
}
func (a *Animal) Play() {
	fmt.Println(a.Speak())
}
func (a *Animal) Speak() string {
	return fmt.Sprintf("my name is %v", a.name)
}
func (a *Animal) Name() string {
	return a.name
}
// Dog 子類狗
type Dog struct {
	Animal
	Gender string
}
func (d *Dog) Speak() string {
	return fmt.Sprintf("%v and my gender is %v", d.Animal.Speak(), d.Gender)
}
func main() {
	d := Dog{
		Animal: Animal{name: "Hachiko"},
		Gender:  "male",
	}
	fmt.Println(d.Name())
	fmt.Println(d.Speak())
	d.Play() // Play() 中調(diào)用的是基類 Animal.Speak() 方法,而不是 Dog.Speak()
}

運(yùn)行輸出:

Hachiko
my name is Hachiko and my gender is male
my name is Hachiko

上面的例子中,Dog 類型重寫(xiě)了 Speak() 方法。然而如果父類型 Animal 有另外一個(gè)方法 Play() 調(diào)用 Speak() 方法,但是 Dog 沒(méi)有重寫(xiě) Play() 的時(shí)候,Dog 類型的 Speak() 方法則不會(huì)被調(diào)用,因?yàn)?Speak() 方法不是抽象方法,此時(shí)繼承無(wú)法實(shí)現(xiàn)多態(tài)。

4.使用接口封裝方法

為了解決上面的問(wèn)題,我們應(yīng)該使用接口封裝方法,通過(guò)實(shí)現(xiàn)接口方法來(lái)實(shí)現(xiàn)多態(tài)。

package main
import (
    "fmt"
)
type Animal interface {
    Name() string
    Speak() string
    Play()
}
type Dog struct {
    name string
    gender string
}
func (d *Dog) Play() {
    fmt.Println(d.Speak())
}
func (d *Dog) Speak() string {
    return fmt.Sprintf("my name is %v and my gender is %v", d.name, d.gender)
}
func (d *Dog) Name() string {
    return d.name
}
func Play(a Animal) {
    a.Play()
}
func main() {
    d :=Dog{"Hachiko", "male"}
    fmt.Println(d.Name())
    fmt.Println(d.Speak())
    Play(d)
}

運(yùn)行輸出:

Hachiko
my name is Hachiko and my gender is male
my name is Hachiko and my gender is male

注意:Go 中某個(gè)類型需要實(shí)現(xiàn)接口中的所有方法才算作實(shí)現(xiàn)了接口。

5.小結(jié)

如果一個(gè) struct 嵌套了另一個(gè)匿名結(jié)構(gòu)體,那么這個(gè)結(jié)構(gòu)可以直接訪問(wèn)匿名結(jié)構(gòu)體的屬性和方法,從而實(shí)現(xiàn)繼承。

如果一個(gè) struct 嵌套了另一個(gè)有名的結(jié)構(gòu)體,那么這個(gè)模式叫做組合。

如果一個(gè) struct 嵌套了多個(gè)匿名結(jié)構(gòu)體,那么這個(gè)結(jié)構(gòu)可以直接訪問(wèn)多個(gè)匿名結(jié)構(gòu)體的屬性和方法,從而實(shí)現(xiàn)多重繼承。

本篇文章就到這里了,希望能幫助到你,也希望您能多多關(guān)注腳本之家的更多內(nèi)容!

您可能感興趣的文章:
  • Django繼承自帶user表并重寫(xiě)的例子
  • Go語(yǔ)言中nil判斷引起的問(wèn)題詳析
  • 分析Go語(yǔ)言中CSP并發(fā)模型與Goroutine的基本使用
  • Go遍歷struct,map,slice的實(shí)現(xiàn)
  • Go 容器遍歷的實(shí)現(xiàn)示例

標(biāo)簽:嘉峪關(guān) 宜賓 新余 延邊 武漢 黑龍江 江西 張掖

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《Golang的繼承模擬實(shí)例》,本文關(guān)鍵詞  Golang,的,繼承,模擬,實(shí)例,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問(wèn)題,煩請(qǐng)?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無(wú)關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《Golang的繼承模擬實(shí)例》相關(guān)的同類信息!
  • 本頁(yè)收集關(guān)于Golang的繼承模擬實(shí)例的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章