Golang面向?qū)ο缶幊讨^承&虛基類【組合&接口】

[TOC]

Golang面向?qū)ο缶幊讨^承&虛基類【組合&接口】

201808

相關說明

Golang里面沒有像C++一樣有繼承相關的概念,但是我們卻可以實現(xiàn)繼承相關的用法,這就要用到struct、interface這兩個結(jié)構。

Golang里面有組合的概念,也就是一個struct 里面可以包含一個或者多個struct,struct可以近似理解為面向?qū)ο缶幊讨械腸lass,但是不能等同,有很多區(qū)別。如果一個struct實現(xiàn)了某個接口的所有方法,那么只要是包含這個struct的所有其他struct也都是實現(xiàn)了這個接口的所有方法

實現(xiàn) class 類

要想實現(xiàn)class類的用法,那么就要用到struct結(jié)構,通過給定struct定義某個成員變量或成員方法就可以實現(xiàn)類的方法

  1. 通過type struct 定義一個struct【類】

    type rsaSecurity struct {
    }
    
  2. 再定義一個這個類的變量,也就是對象

    var RsaSecuritySrv rsaSecurity
    

    類似于構造函數(shù)的定義,也可以通過new一個對象來使用,二選一。

  3. 實現(xiàn)一個這個struct類的方法,需要注意要顯示的聲明所屬對象,即(rs *rsaSecurity)

    // 加密
    func (rs *rsaSecurity) RsaEncrypt(origData []byte) ([]byte, error) {
        //解密pem格式的公鑰
        block, _ := pem.Decode(publicKey)
        if block == nil {
            return nil, errors.New("public key error")
        }
        // 解析公鑰
        pubInterface, err := x509.ParsePKIXPublicKey(block.Bytes)
        if err != nil {
            return nil, err
        }
        // 類型斷言
        pub := pubInterface.(*rsa.PublicKey)
        //加密
        return rsa.EncryptPKCS1v15(rand.Reader, pub, origData)
    }
    

    注意這里是否使用指針,在于是否能夠是否需要徹底修改成員變量的值。

  4. 在任何需要調(diào)用這個成員方法的時候,通過對象來調(diào)用

    func main() {
    
        data, _ := RsaSecuritySrv.RsaEncrypt([]byte(encrypt))
    }
    

實現(xiàn)繼承

直接上代碼如下,很簡單,主要就是一個struct里面包含一個匿名的struct,也就是通過匿名組合來實現(xiàn)

package main

import (
    "fmt"
)

// 【基類】
//定義一個最基礎的struct類MsgModel,里面包含一個成員變量msgId
type MsgModel struct {
    msgId   int
    msgType int
}

// MsgModel的一個成員方法,用來設置msgId
func (msg *MsgModel) SetId(msgId int) {
    msg.msgId = msgId
}

func (msg *MsgModel) SetType(msgType int) {
    msg.msgType = msgType
}

//【子類】
// 再定義一個struct為GroupMsgModel,包含了MsgModel,即組合,但是并沒有給定MsgModel任何名字,因此是匿名組合
type GroupMsgModel struct {
    MsgModel

    // 如果子類也包含一個基類的一樣的成員變量,那么通過子類設置和獲取得到的變量都是基類的
    msgId int
}

func (group *GroupMsgModel) GetId() int {
    return group.msgId
}

/*
func (group *GroupMsgModel) SetId(msgId int) {
    group.msgId = msgId
}
*/

func main() {
    group := &GroupMsgModel{}

    group.SetId(123)
    group.SetType(1)

    fmt.Println("group.msgId =", group.msgId, "\tgroup.MsgModel.msgId =", group.MsgModel.msgId)
    fmt.Println("group.msgType =", group.msgType, "\tgroup.MsgModel.msgType =", group.MsgModel.msgType)
}


實現(xiàn)虛基類的用法

Golang可以通過匿名組合來實現(xiàn)繼承。

Golang可以interface + struct來實現(xiàn)虛基類的用法,必須要實現(xiàn)interface中定義的方法。

1,定義一個interface接口MsgModel,包含了一些方法。

type MsgModel interface {
    Persist(context context.Context, msg interface{}) bool
    PersistOnSensitive(context context.Context, session_type, level, SensitiveStatus int32, msg interface{}) bool
}

3,定義一個類型msgModelImpl,用來實現(xiàn)接口類型

定義一個struct用來實現(xiàn)接口類型
type msgModelImpl struct{}


定義一個變量MsgModelImpl等于msgModelImpl,相當于可以通過MsgModelImpl來調(diào)用msgModelImpl的成員
var MsgModelImpl = msgModelImpl{}

實現(xiàn)接口的兩個方法
func (m msgModelImpl) Persist(context context.Context, msgIface interface{}) bool {
// 具體實現(xiàn)省略
}

func (m msgModelImpl) UpdateDbContent(context context.Context, msgIface interface{}) bool {
// 具體實現(xiàn)省略
}

4, 定義一個struct類型的msgService,包含上述接口類型MsgModel,相當于組合了。這樣的話,這個類型就需要要實現(xiàn)接口方法。

type msgService struct {
   msgModel MsgModel
}

5, 再定義一個變量MsgService,首字母大寫,并且賦值為msgService對象,同時給成員msgModel賦值為上述已經(jīng)實現(xiàn)了接口的struct對象MsgModelImpl。

將上述已經(jīng)實現(xiàn)接口類型的類型(MsgModelImpl) 賦值給此變量(此變量并且要是包含了接口類型的類型), 然后這個變量就可以供外部調(diào)用
var  MsgService = msgService{
        msgModel:  MsgModelImpl,
}

6, 通過MsgService調(diào)用接口方法

7, 小結(jié):

  • MsgModel 是一個interface
    • interface 是一組抽象方法(未具體實現(xiàn)的方法/僅包含方法名參數(shù)返回值的方法)的集合
  • msgModelImpl是一個struct,它實現(xiàn)了MsgModel這個interface的所有方法
    • 如果實現(xiàn)了 interface 中的所有方法,即該類/對象就實現(xiàn)了該接口
  • MsgModelImpl是msgModelImpl這個struct的對象
  • msgService是一個struct,它包含了MsgModel,相當于組合
  • MsgService是msgService這個struct的對象,并對成員變量賦值
最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容