面向?qū)ο笾饕抢^承衡楞、封裝吱雏、多態(tài)
在java中繼承有抽象類的概念、多態(tài)有接口的概念瘾境、封裝有對應(yīng)的訪問修飾符修飾
在go語言中不像java中有關(guān)鍵字定義的這么明確歧杏。那么go沒有class、extend迷守、implement犬绒、public、private等關(guān)鍵字兑凿,那么是如何面向?qū)ο蟮哪?/p>
在go中會以結(jié)構(gòu)體類表示一個(gè)類
以結(jié)構(gòu)體組合的方式來表示繼承
如果一個(gè)結(jié)構(gòu)體有某個(gè)接口的所有方法凯力,那么就認(rèn)為該結(jié)構(gòu)體實(shí)現(xiàn)了該接口
至于public、private以首字母大小寫來區(qū)分礼华,首字母大寫的所有包都能訪問沮协,小寫的只能在本包內(nèi)才能訪問
下面以一個(gè)例子來解釋go如何使用面向?qū)ο螅绻阌衘ava基礎(chǔ)應(yīng)該會比較熟悉下面的例子
package main
import "fmt"
type Bean struct {
beanName string
isSingle bool
}
// BeanFactory 定義BeanFactory接口
type BeanFactory interface {
registerBean(bean Bean)
getSingleBean(beanName string) Bean
}
// AbstractBeanFactory 定義AbstractBeanFactory抽象類實(shí)現(xiàn)BeanFactory接口
type AbstractBeanFactory struct {
// 單例池
singlePool map[string]Bean
}
// 實(shí)現(xiàn)接口注冊bean方法
func (b *AbstractBeanFactory) registerBean(bean Bean) {
if bean.isSingle {
if nil == b.singlePool {
b.singlePool = make(map[string]Bean)
}
b.singlePool[bean.beanName] = bean
}
}
// 實(shí)現(xiàn)接口獲取單例bean方法
func (b *AbstractBeanFactory) getSingleBean(beanName string) Bean {
return b.singlePool[beanName]
}
// ApplicationContext 具體業(yè)務(wù)實(shí)現(xiàn)類繼承AbstractBeanFactory抽象類
type ApplicationContext struct {
AbstractBeanFactory
}
// 重寫注冊bean方法
func (b *ApplicationContext) registerBean(bean Bean) {
fmt.Println("ApplicationContext ... registerBean")
b.AbstractBeanFactory.registerBean(bean)
}
func main() {
bean := Bean{isSingle: true, beanName: "restTemplate"}
// 多態(tài)使用
var factory BeanFactory = &ApplicationContext{}
// 打印factory 類型
fmt.Printf("%T\n", factory)
factory.registerBean(bean)
fmt.Println(factory.getSingleBean("name"))
fmt.Println(factory.getSingleBean("restTemplate"))
}
從圖片中g(shù)oland的提示可以知道 AbstractBeanFactory 實(shí)現(xiàn)了BeanFactory接口卓嫂,ApplicationContext重寫了AbstractBeanFactory的registerBean方法
執(zhí)行結(jié)果
*main.ApplicationContext
ApplicationContext ... registerBean
{ false}
{restTemplate true}
從結(jié)果中可以看出factory以接口類型BeanFactory接收一個(gè)具體子類對象ApplicationContext
執(zhí)行 registerBean 方法實(shí)際上執(zhí)行的是 ApplicationContext 的 registerBean 方法
執(zhí)行g(shù)etSingleBean方法,由于ApplicationContext沒有該方法聘殖,會從父類 AbstractBeanFactory 找到該方法執(zhí)行
到這go中面向?qū)ο蟮氖褂镁徒榻B完了
歡迎關(guān)注晨雳,學(xué)習(xí)不迷路行瑞!