首页 > 其他分享 >golang 父类调用子类方法、继承多态的实现方式

golang 父类调用子类方法、继承多态的实现方式

时间:2024-09-24 16:04:16浏览次数:8  
标签:Name 子类 self 多态 golang func 父类 type

golang 父类调用子类方法、继承多态的实现方式 - 个人文章 - SegmentFault 思否

 

实现思路

go 语言中,当子类调用父类方法时,“作用域”将进入父类的作用域,看不见子类的方法存在(个人想象的)

我们可以通过参数将子类传递给父类,实现在父类中调用子类方法。

实现方式有两种:

一、 基于接口

定义接口,父子类都实现接口,父类方法接收接口类型参数

特点:

  • 结构简单,思路清晰。
  • 基于接口,轻松应对多级继承的情况。
推荐使用这种方式

直接上代码:

package main

import (
    "fmt"
)

type Name interface {
    Name() string
}

type A struct {
}

func (self A) say() {
    println(self.Name())
}

func (self A) sayReal(child Name) {
    fmt.Println(child.Name())
}

func (self A) Name() string {
    return "I'm A"
}

type B struct {
    A
}

func (self B) Name() string {
    return "I'm B"
}


type C struct {
    A
}

func main() {
    b := B{}
    b.say()         //I'm A
    b.sayReal(b)    //I'm B

    c := C{}
    c.say()         //I'm A
    c.sayReal(c)    //I'm A
}

二、 基于反射

父类方法接收子类对象,通过反射调用子类方法

直接上代码:

package main

import (
    "fmt"
    "reflect"
)

type A struct {
}

func (self A) say() {
    println(self.Name())
}

func (self A) sayReal(child interface{}) {
    ref := reflect.ValueOf(child)
    method := ref.MethodByName("Name")
    if (method.IsValid()) {
        r := method.Call(make([]reflect.Value, 0))
        fmt.Println(r[0].String())
    } else {
        // 错误处理
    }
}

func (self A) Name() string {
    return "I'm A"
}

type B struct {
    A
}

func (self B) Name() string {
    return "I'm B"
}


type C struct {
    A
}

func main() {
    b := B{}
    b.say()         //I'm A
    b.sayReal(b)    //I'm B

    c := C{}
    c.say()         //I'm A
    c.sayReal(c)    //I'm A
}
go继承多态

标签:Name,子类,self,多态,golang,func,父类,type
From: https://www.cnblogs.com/rxbook/p/18429317

相关文章

  • 76.最小覆盖子串 Golang实现
    题目描述:给你一个字符串s、一个字符串t。返回s中涵盖t所有字符的最小子串。如果s中不存在涵盖t所有字符的子串,则返回空字符串""。注意:对于t中重复字符,我们寻找的子字符串中该字符数量必须不少于t中该字符数量。如果s中存在这样的子串,我们保证它是唯一的答......
  • 10分钟速成golang
    Go拥有命令式语言的静态类型,编译很快,执行也很快,同时加入了对于目前多核CPU的并发计算支持,也有相应的特性来实现大规模编程。//单行注释/*多行注释*///导入包的子句在每个源文件的开头。//main比较特殊,它用来声明可执行文件,而不是一个库。packagemain//Import......
  • 3. 无重复字符的最长子串 Golang实现
    题目描述给定一个字符串s,请你找出其中不含有重复字符的最长子串的长度。注意区分子串和子序列。示例3:输入:s="pwwkew"输出:3解释:因为无重复字符的最长子串是"wke",所以其长度为3。请注意,你的答案必须是子串的长度,"pwke"是一个子序列,不是子串。思路分析:1.......
  • system.text.Json 针对继承多态类型的集合,使用自定义Converter,进行json序列化
    测试类:[JsonConverter(typeof(PersonConverter))]publicclassPerson{publicstringFirstName{get;set;}publicstringLastName{get;set;}}[JsonConverter(typeof(PersonConverter))]publicclassEmployee:Person{pub......
  • C++从入门到起飞之——多态 全方位剖析!
    ......
  • golang 项目引入私有仓库包
    场景:当你多个项目,都需要使用一个或者多个方法,那么可以将公共方法,抽成一个包,进行管理(类似Log模块等)。这时候可以将你的包上传到私有的仓库,其他项目引入该包即可。下面来介绍下,如何引用私有仓库的包。1. 创建一个新的Git标签假设你已经在你的私有GitLab仓库目录中,并且你已经......
  • Java入门:09.Java中三大特性(封装、继承、多态)02
    2继承需要两个类才能实现继承的效果。比如:类A继承类BA类称为子类,衍生类,派生类B类称为父类,基类,超类继承的作用子类自动的拥有父类的所有属性和方法(父类编写,子类不需要再编写)。代码复用目前私有的属性和方法无法访问。多态的基础。继承语法先定义父......
  • Golang在线客服系统源码:基于Gin框架,Websocket即时通讯企业网站客服聊天源码,包括后台管
    唯一客服系统是一款基于Golang的Gin框架构建的在线客服解决方案,支持独立部署,确保数据的私密性和安全性。它具备自适应的响应式设计,能够完美适配PC端、移动端以及APP内嵌等多种场景。客服端提供PC后台管理功能,实现实时消息接收和交流。此外,为了满足移动端回复需求,系统还利用uniapp......
  • C++ 多态
    一、多态的概念多态简单来说就是多种形态。多态又分为编译时多态(静态多态)和运行时多态(动态多态)。编译时多态(静态多态)主要就是我们一般讲的函数重载和函数模板。运行时多态,具体点就是去完成某个行为(函数),可以传不同的对象就会完成不同的行为,就达到多种形态。就像我们买火......
  • C++ | 多态
     前言本篇博客讲解c++中的继承......