Go語言面向?qū)ο笾械亩鄳B(tài)你學(xué)會了嗎
認(rèn)識多態(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)用相應(yīng)的方法,無需關(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)用相應(yīng)的方法。
$animal1 = new Dog(); $animal1->makeSound(); // Output: Dog barks. $animal2 = new Cat(); $animal2->makeSound(); // Output: Cat meows.
通過以上步驟,我們可以實現(xiàn)多態(tài)性,即相同父類類型的對象(例如Animal),在不同的對象實例下調(diào)用相應(yīng)的子類方法(例如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)容就可以理解為不同的行為,當(dāng)然你也可以在這個方法中做其他的操作。
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è)當(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ā)起支付請求使用。
我是微信支付,現(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ā)起支付請求使用。
我是支付寶支付,現(xiàn)在我正在接受支付寶通知的參數(shù),用于修改用戶訂單支付狀態(tài)。
到此,在Go中實現(xiàn)面向?qū)ο笠约叭筇匦?封裝、繼承和多態(tài))就給大家分享完畢。
到此這篇關(guān)于Go語言面向?qū)ο笾械亩鄳B(tài)你學(xué)會了嗎的文章就介紹到這了,更多相關(guān)Go面向?qū)ο?多態(tài)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Go json omitempty如何實現(xiàn)可選屬性
在Go語言中,使用`omitempty`可以幫助我們在進行JSON序列化和反序列化時,忽略結(jié)構(gòu)體中的零值或空值,本文介紹了如何通過將字段類型改為指針類型,并在結(jié)構(gòu)體的JSON標(biāo)簽中添加`omitempty`來實現(xiàn)這一功能,例如,將float32修改為*float322024-09-09
Go語言處理超大字符串型整數(shù)加減經(jīng)典面試詳解
這篇文章主要為大家介紹了Go語言處理超大字符串型整數(shù)加減經(jīng)典面試示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-10-10

