欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Go語言面向?qū)ο笾械亩鄳B(tài)你學(xué)會(huì)了嗎

 更新時(shí)間:2023年07月20日 11:38:10   作者:Mandy的名字被占用了  
面向?qū)ο笾械亩鄳B(tài)(Polymorphism)是指一個(gè)對(duì)象可以具有多種不同的形態(tài)或表現(xiàn)方式,本文將通過一些簡(jiǎn)單的示例為大家講解一下多態(tài)的實(shí)現(xiàn),需要的可以參考下

上一篇,我們分享了在Go中是如何實(shí)現(xiàn)面向?qū)ο?/a>,文章中對(duì)面向?qū)ο蟮娜筇匦灾械睦^承、封裝,做了一個(gè)理論和實(shí)踐的總結(jié),這一篇繼續(xù)分享關(guān)于另外一個(gè)特性,那就是多態(tài)。

認(rèn)識(shí)多態(tài)

老規(guī)矩,在代碼實(shí)踐之前,先對(duì)基礎(chǔ)知識(shí)做一個(gè)普及。

1、面向?qū)ο笾械亩鄳B(tài)(Polymorphism)是指一個(gè)對(duì)象可以具有多種不同的形態(tài)或表現(xiàn)方式。簡(jiǎn)單來說,就是同一個(gè)類型的對(duì)象,在不同的上下文中表現(xiàn)出不同的行為。多態(tài)性是面向?qū)ο蟮娜筇匦灾唬ǚ庋b、繼承、多態(tài))。

2、在多態(tài)中,父類的引用可以指向子類的對(duì)象,通過父類的引用調(diào)用子類的方法。這樣可以實(shí)現(xiàn)代碼的靈活性和擴(kuò)展性,可以根據(jù)具體的對(duì)象類型調(diào)用相應(yīng)的方法,無需關(guān)心對(duì)象的具體類型。

3、通過多態(tài)性,可以通過統(tǒng)一的接口來處理不同的對(duì)象,實(shí)現(xiàn)代碼的簡(jiǎn)潔性和可維護(hù)性。多態(tài)性提供了一種抽象的方式來處理對(duì)象的不同行為,使得代碼更具靈活性和可擴(kuò)展性。

總結(jié)一句,就是同一個(gè)方法在不同的對(duì)象實(shí)例中,可以有不同的行為。這里簡(jiǎn)單用PHP舉一個(gè)案例。

在PHP中實(shí)現(xiàn)多態(tài)需要遵循以下幾個(gè)步驟:

1、創(chuàng)建父類(基類):定義一個(gè)包含通用方法和屬性的父類。

class Animal {
  public function makeSound() {
    echo "Animal makes sound.";
  }
}

2、創(chuàng)建子類(派生類):繼承父類,并添加自己特定的方法和屬性。

class Dog extends Animal {
  public function makeSound() {
    echo "Dog barks.";
  }
}
class Cat extends Animal {
  public function makeSound() {
    echo "Cat meows.";
  }
}

3、創(chuàng)建對(duì)象并調(diào)用方法:通過父類的引用來實(shí)例化子類對(duì)象,可以根據(jù)具體的對(duì)象類型調(diào)用相應(yīng)的方法。

$animal1 = new Dog();
$animal1->makeSound(); // Output: Dog barks.
$animal2 = new Cat();
$animal2->makeSound(); // Output: Cat meows.

通過以上步驟,我們可以實(shí)現(xiàn)多態(tài)性,即相同父類類型的對(duì)象(例如Animal),在不同的對(duì)象實(shí)例下調(diào)用相應(yīng)的子類方法(例如Dog或Cat)。這樣就實(shí)現(xiàn)了多態(tài)的效果。

Go語言實(shí)現(xiàn)

因?yàn)镚o中沒有面向?qū)ο蟮母拍?,但根?jù)多態(tài)的定義和特點(diǎn),我們可以使用Go中的interface來實(shí)現(xiàn)多態(tài)。

package main
import "fmt"
type Animal interface {
	run()
}
type Turtle struct {
}
func (t Turtle) run() {
	fmt.Println("烏龜爬行很慢")
}
type Rabbit struct {
}
func (r Rabbit) run() {
	fmt.Println("兔子跑步很快")
}
func main() {
	var animal Animal
	// 實(shí)例化一個(gè)Turtle對(duì)象
	animal = &Turtle{}
	animal.run()
	// 實(shí)例化一個(gè)Rabbit對(duì)象
	animal = &Rabbit{}
	animal.run()
}

1、首先我們定義了一個(gè)Animal的接口,并在接口中定義了一個(gè)約束,就是run()方法。

2、接著我們定義了Turtle和Rabbit兩個(gè)結(jié)構(gòu)體,并分別定義了一個(gè)run()方法。

3、此時(shí)兩個(gè)結(jié)構(gòu)體隱式的實(shí)現(xiàn)了Animal接口中的方法。

4、根據(jù)多態(tài)的特性,兩個(gè)結(jié)構(gòu)體中的方法,都可以具備自己的行為。我們?cè)趦蓚€(gè)方法中分別打印了內(nèi)容,此時(shí)能夠打印出不同的內(nèi)容。不同的內(nèi)容就可以理解為不同的行為,當(dāng)然你也可以在這個(gè)方法中做其他的操作。

5、在main()方法中,創(chuàng)建一個(gè)Animal的變量,并通過不同的結(jié)構(gòu)體實(shí)例,調(diào)用相同的方法名,最終輸出不同的內(nèi)容。

實(shí)戰(zhàn)案例

上面對(duì)多態(tài)有了一定的了解,接著列舉一個(gè)實(shí)戰(zhàn)的案例。

在系統(tǒng)支付,一般我們會(huì)對(duì)接微信和支付寶這樣的平臺(tái),大致的流程就是,創(chuàng)建訂單記錄->組裝支付參數(shù)->發(fā)起支付請(qǐng)求->支付平臺(tái)進(jìn)行回調(diào)通知->修改訂單支付狀態(tài)。

基于這樣的邏輯,我們使用一個(gè)Pay接口,定義三個(gè)方法。

type Pay interface {
	createOrder() // 創(chuàng)建訂單
	createPay()   // 常見支付參數(shù)
	notifyPay()   // 回調(diào)通知
}

接著定義具體的實(shí)現(xiàn)類,就是微信支付和支付寶支付。

1、定義一個(gè)微信支付,用來實(shí)現(xiàn)接口中的三個(gè)方法。

type WeChat struct {
	// 微信支付方式
}
func (a WeChat) createOrder() {
	fmt.Println("我是微信支付,現(xiàn)在我正在創(chuàng)建訂單數(shù)據(jù),用于記錄到數(shù)據(jù)庫中。")
}
func (a WeChat) createPay() {
	fmt.Println("我是微信支付,現(xiàn)在我正在創(chuàng)建支付數(shù)據(jù),用于向微信發(fā)起支付請(qǐng)求使用。")
}
func (a WeChat) notifyPay() {
	fmt.Println("我是微信支付,現(xiàn)在我正在接受微信通知的參數(shù),用于修改用戶訂單支付狀態(tài)。")
}

2、定義一個(gè)支付寶支付,用來實(shí)現(xiàn)接口中的三個(gè)方法。

type Ali struct {
	// 支付寶支付方式
}
func (a Ali) createOrder() {
	fmt.Println("我是支付寶支付,現(xiàn)在我正在創(chuàng)建訂單數(shù)據(jù),用于記錄到數(shù)據(jù)庫中。")
}
func (a Ali) createPay() {
	fmt.Println("我是支付寶支付,現(xiàn)在我正在創(chuàng)建支付數(shù)據(jù),用于向支付寶發(fā)起支付請(qǐng)求使用。")
}
func (a Ali) notifyPay() {
	fmt.Println("我是支付寶支付,現(xiàn)在我正在接受支付寶通知的參數(shù),用于修改用戶訂單支付狀態(tài)。")
}

接下來,就來進(jìn)行實(shí)際的訂單操作。

1、假設(shè)當(dāng)前的支付渠道使用的是微信支付。

func main() {
	var pay Pay
	pay = &WeChat{}
	pay.createOrder()
	pay.createPay()
	pay.notifyPay()
}

最終輸出的結(jié)果為:

我是微信支付,現(xiàn)在我正在創(chuàng)建訂單數(shù)據(jù),用于記錄到數(shù)據(jù)庫中。
我是微信支付,現(xiàn)在我正在創(chuàng)建支付數(shù)據(jù),用于向微信發(fā)起支付請(qǐng)求使用。
我是微信支付,現(xiàn)在我正在接受微信通知的參數(shù),用于修改用戶訂單支付狀態(tài)。

2、假設(shè)當(dāng)前的支付渠道使用的是支付寶支付。

func main() {
	var pay Pay
	pay = &Ali{}
	pay.createOrder()
	pay.createPay()
	pay.notifyPay()
}

最終輸出結(jié)果為:

我是支付寶支付,現(xiàn)在我正在創(chuàng)建訂單數(shù)據(jù),用于記錄到數(shù)據(jù)庫中。
我是支付寶支付,現(xiàn)在我正在創(chuàng)建支付數(shù)據(jù),用于向支付寶發(fā)起支付請(qǐng)求使用。
我是支付寶支付,現(xiàn)在我正在接受支付寶通知的參數(shù),用于修改用戶訂單支付狀態(tài)。

到此,在Go中實(shí)現(xiàn)面向?qū)ο笠约叭筇匦?封裝、繼承和多態(tài))就給大家分享完畢。

到此這篇關(guān)于Go語言面向?qū)ο笾械亩鄳B(tài)你學(xué)會(huì)了嗎的文章就介紹到這了,更多相關(guān)Go面向?qū)ο?多態(tài)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 一文教你如何在Golang中用好泛型

    一文教你如何在Golang中用好泛型

    golang的泛型已經(jīng)出來了一年多了,從提案被接受開始我就在關(guān)注泛型了,好用是好用,但問題也很多,所以本文就來教大家如何在Golang中用好泛型吧
    2023-07-07
  • Golang如何使用go.mod配置加載本地模塊

    Golang如何使用go.mod配置加載本地模塊

    這篇文章主要介紹了Golang如何使用go.mod配置加載本地模塊問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-09-09
  • Go語言格式化動(dòng)詞使用詳解

    Go語言格式化動(dòng)詞使用詳解

    這篇文章主要介紹了Go語言格式化動(dòng)詞使用詳解的相關(guān)資料,需要的朋友可以參考下
    2023-08-08
  • golang去除多余的空格與換行符示例代碼

    golang去除多余的空格與換行符示例代碼

    Golang是一種強(qiáng)大的編程語言,提供了豐富的字符串處理功能,這篇文章主要給大家介紹了關(guān)于golang去除多余的空格與換行符的相關(guān)資料,需要的朋友可以參考下
    2023-10-10
  • 一文讀懂go中semaphore(信號(hào)量)源碼

    一文讀懂go中semaphore(信號(hào)量)源碼

    這篇文章主要介紹了一文讀懂go中semaphore(信號(hào)量)源碼的相關(guān)知識(shí),本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-04-04
  • Go語言實(shí)現(xiàn)socket實(shí)例

    Go語言實(shí)現(xiàn)socket實(shí)例

    這篇文章主要介紹了Go語言實(shí)現(xiàn)socket的方法,實(shí)例分析了socket客戶端與服務(wù)器端的實(shí)現(xiàn)技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下
    2015-02-02
  • Go json omitempty如何實(shí)現(xiàn)可選屬性

    Go json omitempty如何實(shí)現(xiàn)可選屬性

    在Go語言中,使用`omitempty`可以幫助我們?cè)谶M(jìn)行JSON序列化和反序列化時(shí),忽略結(jié)構(gòu)體中的零值或空值,本文介紹了如何通過將字段類型改為指針類型,并在結(jié)構(gòu)體的JSON標(biāo)簽中添加`omitempty`來實(shí)現(xiàn)這一功能,例如,將float32修改為*float32
    2024-09-09
  • Go語言處理超大字符串型整數(shù)加減經(jīng)典面試詳解

    Go語言處理超大字符串型整數(shù)加減經(jīng)典面試詳解

    這篇文章主要為大家介紹了Go語言處理超大字符串型整數(shù)加減經(jīng)典面試示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-10-10
  • 快速掌握Go語言正/反向代理

    快速掌握Go語言正/反向代理

    這篇文章主要介紹了快速掌握Go語言正/反向代理的相關(guān)資料,需要的朋友可以參考下
    2022-11-11
  • Golang如何交叉編譯各個(gè)平臺(tái)的二進(jìn)制文件詳解

    Golang如何交叉編譯各個(gè)平臺(tái)的二進(jìn)制文件詳解

    這篇文章主要給大家介紹了關(guān)于Golang如何交叉編譯各個(gè)平臺(tái)的二進(jìn)制文件的相關(guān)資料,并介紹了golang如何讓編譯生產(chǎn)的二進(jìn)制文件變小,對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2018-08-08

最新評(píng)論