最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

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

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

認識多態(tài)

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

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

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

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

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

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

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

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)建對象并調(diào)用方法:通過父類的引用來實例化子類對象,可以根據(jù)具體的對象類型調(diào)用相應的方法。

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

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

Go語言實現(xiàn)

因為Go中沒有面向?qū)ο蟮母拍睿鶕?jù)多態(tài)的定義和特點,我們可以使用Go中的interface來實現(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
	// 實例化一個Turtle對象
	animal = &Turtle{}
	animal.run()
	// 實例化一個Rabbit對象
	animal = &Rabbit{}
	animal.run()
}

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

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

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

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

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

實戰(zhàn)案例

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

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

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

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

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

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

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ā)起支付請求使用。")
}
func (a WeChat) notifyPay() {
	fmt.Println("我是微信支付,現(xiàn)在我正在接受微信通知的參數(shù),用于修改用戶訂單支付狀態(tài)。")
}

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

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ā)起支付請求使用。")
}
func (a Ali) notifyPay() {
	fmt.Println("我是支付寶支付,現(xiàn)在我正在接受支付寶通知的參數(shù),用于修改用戶訂單支付狀態(tài)。")
}

接下來,就來進行實際的訂單操作。

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

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ā)起支付請求使用。
我是微信支付,現(xiàn)在我正在接受微信通知的參數(shù),用于修改用戶訂單支付狀態(tài)。

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

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ā)起支付請求使用。
我是支付寶支付,現(xiàn)在我正在接受支付寶通知的參數(shù),用于修改用戶訂單支付狀態(tài)。

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

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

相關(guān)文章

  • 詳解Go語言如何對數(shù)據(jù)庫進行CRUD操作

    詳解Go語言如何對數(shù)據(jù)庫進行CRUD操作

    在這篇文章中,主要帶大家來學習一下在Go語言中如何對數(shù)據(jù)庫進行CRUD操作,從而探討一下Go的接口編程,感興趣的小伙伴可以跟隨小編一起學習一下
    2023-05-05
  • Go語言操作MySql數(shù)據(jù)庫的詳細指南

    Go語言操作MySql數(shù)據(jù)庫的詳細指南

    數(shù)據(jù)的持久化是程序中必不可少的,所以編程語言中對數(shù)據(jù)庫的操作是非常重要的一塊,這篇文章主要給大家介紹了關(guān)于Go語言操作MySql數(shù)據(jù)庫的相關(guān)資料,需要的朋友可以參考下
    2023-10-10
  • 詳解Go語言中如何高效地處理集合

    詳解Go語言中如何高效地處理集合

    在?Go?語言中,雖然沒有像?Java?或?Python?那樣的傳統(tǒng)集合框架,但也可以非常高效地處理集合操作,下面小編就來和大家講講具體處理方法吧
    2025-01-01
  • Go語言實戰(zhàn)之切片內(nèi)存優(yōu)化

    Go語言實戰(zhàn)之切片內(nèi)存優(yōu)化

    Go 語言的切片是一個動態(tài)的數(shù)據(jù)結(jié)構(gòu),可以方便地對其進行擴容和縮容操作。這篇文章主要為大家詳細介紹了Go語言如何實現(xiàn)切片內(nèi)存優(yōu)化,需要的可以參考一下
    2023-03-03
  • IdeaGo啟動報錯Failed to create JVM的問題解析

    IdeaGo啟動報錯Failed to create JVM的問題解析

    這篇文章主要介紹了IdeaGo啟動報錯Failed to create JVM的問題,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-11-11
  • Go語言原子操作atomic的使用

    Go語言原子操作atomic的使用

    本文介紹了Go語言原子操作的使用方法,原子操作是一種無鎖的技術(shù),可通過CPU指令實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2024-10-10
  • 用Go+Vue.js快速搭建一個Web應用(初級demo)

    用Go+Vue.js快速搭建一個Web應用(初級demo)

    這篇文章主要介紹了用Go+Vue.js快速搭建一個Web應用(初級demo),本文給大家介紹的非常詳細,具有參考借鑒價值,需要的朋友參考下吧
    2017-11-11
  • 使用Go實現(xiàn)偽靜態(tài)URL重寫功能

    使用Go實現(xiàn)偽靜態(tài)URL重寫功能

    在Web開發(fā)中,偽靜態(tài)URL已成為優(yōu)化網(wǎng)站架構(gòu)和提升SEO的常用技術(shù)手段,偽靜態(tài)URL是一種介于動態(tài)URL和靜態(tài)URL之間的解決方案,本文給大家介紹了如何使用Go實現(xiàn)偽靜態(tài)URL重寫功能,需要的朋友可以參考下
    2024-08-08
  • Golang 如何判斷數(shù)組某個元素是否存在 (isset)

    Golang 如何判斷數(shù)組某個元素是否存在 (isset)

    這篇文章主要介紹了Golang 如何判斷數(shù)組某個元素是否存在 (isset),具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-04-04
  • Go語言中實現(xiàn)打印堆棧的errors包的用法詳解

    Go語言中實現(xiàn)打印堆棧的errors包的用法詳解

    因為Go語言提供的錯誤太簡單了,以至于簡單的我們無法更好的處理問題,所以誕生了很多對錯誤處理的庫,github.com/pkg/errors是比較簡潔的一樣,本文就來聊聊它的具體用法吧
    2023-07-07

最新評論

辉南县| 汉阴县| 玉屏| 镇坪县| 华蓥市| 黔江区| 德惠市| 万山特区| 当雄县| 浏阳市| 营口市| 抚松县| 常宁市| 玉山县| 南岸区| 海门市| 侯马市| 威信县| 邵武市| 砀山县| 盐亭县| 东源县| 巴楚县| 宁海县| 营山县| 沙雅县| 平南县| 无为县| 长阳| 黄梅县| 宝坻区| 胶南市| 赤峰市| 枝江市| 大港区| 平和县| 美姑县| 澳门| 甘南县| 枣阳市| 泽库县|