網(wǎng)站首頁(yè) 編程語(yǔ)言 正文
多態(tài)是什么
相信學(xué)過(guò)Java這種面向?qū)ο笳Z(yǔ)言的同學(xué)對(duì)于多態(tài)來(lái)說(shuō)都不陌生,在代碼執(zhí)行的時(shí)候,能夠根據(jù)子類的類型去執(zhí)行子類當(dāng)中的方法。多態(tài)是指代碼可以根據(jù)類型的具體實(shí)現(xiàn)采取不同行為的能力。如果一個(gè)類型實(shí)現(xiàn)了某個(gè)接口,所有使用這個(gè)接口的地方,都可以支持這種類型的值。
Go語(yǔ)言多態(tài)舉例
有這樣一個(gè)場(chǎng)景,我們?cè)趹?yīng)用開(kāi)發(fā)中涉及到很多通知事件,通知的類型可以是通過(guò)微信、QQ、Email等,那么我們可以抽象出一個(gè)接口,定義一個(gè)通知的接口,然后微信通知類、QQ通知類、Email通知類分別實(shí)現(xiàn)對(duì)應(yīng)的通知方法。
定義一個(gè)通知類型:notifier
// 通知者接口 type Notifier interface { // 通知方法,可以由具體的類進(jìn)行實(shí)現(xiàn) notify() }
定義微信類型、QQ類型、Email類型,并實(shí)現(xiàn)notify方法,以指針類型作為方法的接收者
type WechatNotifier struct { ?? ?Name ? ?string ?? ?Message string } func (w *WechatNotifier) notify() { ?? ?fmt.Printf("%v notify %v \n", w.Name, w.Message) } type QQNotifier struct { ?? ?Name ? ?string ?? ?Message string } func (q *QQNotifier) notify() { ?? ?fmt.Printf("%v notify %v \n", q.Name, q.Message) } type EmailNotifier struct { ?? ?Name ? ?string ?? ?Message string } func (e *EmailNotifier) notify() { ?? ?fmt.Printf("%v notify %v \n", e.Name, e.Message) }
定義發(fā)送通知方法,入?yún)镹otifier;等需要調(diào)用的時(shí)候,需要傳入實(shí)現(xiàn)了Notifier中的接口的類型
func sendNotify(notifier Notifier) { notifier.notify() }
測(cè)試一下
func main() { ?? ?w := &WechatNotifier{ ?? ??? ?Name: ? ?"微信", ?? ??? ?Message: "微信消息", ?? ?} ?? ?q := &QQNotifier{ ?? ??? ?Name: ? ?"QQ", ?? ??? ?Message: "QQ消息", ?? ?} ?? ?e := &EmailNotifier{ ?? ??? ?Name: ? ?"Email", ?? ??? ?Message: "Email消息", ?? ?} ?? ?// 接受微信類型 ?? ?sendNotify(w) ?? ?// 接受QQ類型 ?? ?sendNotify(q) ?? ?// 接受Email類型 ?? ?sendNotify(e) }
測(cè)試結(jié)果如下:
總結(jié)
Golang中主要是采用了接口來(lái)實(shí)現(xiàn)多態(tài),先定義一個(gè)抽象接口,然后再定義具體的實(shí)現(xiàn)類并實(shí)現(xiàn)接口中的方法,當(dāng)我們需要定義一個(gè)通用的方法時(shí),方法的入?yún)⒖梢越邮找粋€(gè)接口類型,這樣在程序設(shè)計(jì)的時(shí)候就可以不必多寫(xiě)類似的方法從而接受不同的類了,在程序的運(yùn)行時(shí),就可以動(dòng)態(tài)地把該接口指向的具體類型,從而執(zhí)行具體類型的方法!
原文鏈接:https://blog.csdn.net/weixin_43395911/article/details/123023919
相關(guān)推薦
- 2023-06-04 Pandas通過(guò)index選擇并獲取行和列_python
- 2023-04-06 C語(yǔ)言中雙鏈表的基本操作_C 語(yǔ)言
- 2023-02-02 redis中的配置以及密碼設(shè)置方式_Redis
- 2022-12-09 OpenCV?imread讀取圖片失敗的問(wèn)題及解決_python
- 2023-04-02 Flutter應(yīng)用Windows平臺(tái)接入實(shí)踐詳解_C 語(yǔ)言
- 2022-04-12 用python繪制極坐標(biāo)雷達(dá)圖_python
- 2022-08-10 pandas.DataFrame.from_dict直接從字典構(gòu)建DataFrame的方法_pyth
- 2022-10-25 IDEA 安裝tomcat10創(chuàng)建servlet報(bào)404錯(cuò)誤
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細(xì)win安裝深度學(xué)習(xí)環(huán)境2025年最新版(
- Linux 中運(yùn)行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲(chǔ)小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎(chǔ)操作-- 運(yùn)算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認(rèn)證信息的處理
- Spring Security之認(rèn)證過(guò)濾器
- Spring Security概述快速入門(mén)
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權(quán)
- redisson分布式鎖中waittime的設(shè)
- maven:解決release錯(cuò)誤:Artif
- restTemplate使用總結(jié)
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實(shí)現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務(wù)發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結(jié)構(gòu)-簡(jiǎn)單動(dòng)態(tài)字符串(SD
- arthas操作spring被代理目標(biāo)對(duì)象命令
- Spring中的單例模式應(yīng)用詳解
- 聊聊消息隊(duì)列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠(yuǎn)程分支