首页 > 其他分享 >组合式继承

组合式继承

时间:2023-11-27 17:24:11浏览次数:24  
标签:组合式 调用 People 继承 ShowA ShowB showB main

组合式继承

code

package main
import (
    "fmt"
)
type People struct{}

func (p *People) ShowA() {
    fmt.Println("showA")
    p.ShowB()
}

func (p *People) ShowB() {
    fmt.Println("showB")
}

type Teacher struct {
    People
}

func (t *Teacher) ShowB() {
    fmt.Println("teacher showB")
}

func main() {
    t := Teacher{}
    t.ShowA()
}

运行结果:

showA
showB

在调用t.ShowA()时,会先在t的类型中查找ShowA()方法

  • 找到ShowA()方法后,直接调用
  • 未找到ShowA()方法,则去t的嵌入类型查找,在People找到,在底层进行转换是(&(t.People)).ShowA(),也就是(*People).showA(&(t.People))

后续在ShowA()中调用ShowB()时,会先在t的类型中查找ShowB()方法,也就是People中查找,找到后,调用PeopleShowB()方法

ps: 个人认为这是比较垃圾的代码,只应该出现在面试题中,不应该出现在实际代码中
一般开发都是基于接口,去做组合式继承,其次不要进行隐式转换/调用,正常应该是t.People.ShowA()

如果面试官反问你怎么从People中反调到Teacher中的ShowB()方法,建议先给他个大逼兜,让他说下为啥要这样做

可以考虑定义showB() 接口,在people中定义该接口对象,通过show对象调用方法showB()

type Show interface {
    ShowB()
}

type People struct {
    show Show
}
go tool compile -l -p  main main.go --> main.o

go tool nm main.o  |grep `T` |grep People

extra

img

B只有Value()方法,因为内部是A,而A的相关函数都是值传递,无法拿到实际地址,所以Set()方法的生成就不需要了

标签:组合式,调用,People,继承,ShowA,ShowB,showB,main
From: https://www.cnblogs.com/erfeng/p/17859836.html

相关文章

  • 继承
    继承的本质是对某一批类的抽象,从而实现对现实世界更好的建模extands的意思是扩展,子类是父类的扩展Java中类只有单继承,没有多继承继承是类和类的一种关系,除此之外的关系还有依赖,组合,聚合等继承关系的两个类,一个为子类(派生类),一个为父类(基类)子类继承父类,使用关键字extends来表示子类......
  • C++类继承
    #include<iostream>classtopClass{  public:       topClass(intvalue)        {                ival=value;                printf("\nthei......
  • Golang Gin 请求参数的获取值 & 路由分组 & 控制器继承
    一. 请求参数的获取值  动态路由1typeUserstruct{2Usernamestring`form:"username"json:"username"`3Passwordstring`form:"password"json:"password"`4Ageint`form:"age"json:"......
  • UML类图关系(泛化 、继承、实现、依赖、关联、聚合、组合)
    UML类图关系(泛化、继承、实现、依赖、关联、聚合、组合)1.继承继承是指一个类(称为子类、子接口)继承令一个类(称为父类、付接口)的功能子类具有可以增加它自己的新功能的能力在Java中此类关系通过关键字extends明确标志且子类只能继承一个父类,单继承包括类继承和接口继承两......
  • VUE中选项式API和组合式API讲解。
    Vue.js提供了两种主要的API风格:选项式API(OptionsAPI)和组合式API(CompositionAPI)。这两种API风格可以用来编写Vue组件,但它们在组织代码、复用逻辑和组件结构等方面有不同的方式。选项式API是Vue.js最早引入的API风格,它使用对象形式来定义组件的选项。在选项式API......
  • C#编程精要:深入理解继承、多态、抽象和接口
    文章目录继承基类和派生类多重继承子类调用父类构造器子类调用父类方法多态静态多态性函数重载运算符重载动态多态性抽象类抽象属性抽象方法虚方法方法重写方法覆盖覆写和覆盖的区别密封类(sealed)接口接口特点定义接口实现接口接口继承显式实......
  • java 继承
    继承的特点Java只支持单继承,不支持多继承,但支持多层继承。单继承:一个子类只能继承一个父类不支持多继承:子类不能同时继承多个父类多层继承:子类A继承父类B,父类B可以继承父类C每一个类都直接或者间接的继承于Object......
  • 无涯教程-D语言 - 继承
    面向对象编程中最重要的概念之一是继承,继承允许使用一个类继承另一个类,这样就可以直接调用父类的公共函数或变量,这使得维护变得更加容易。基类和子类子类通过":"冒号来实现继承基类。classderived-class:base-class考虑如下基类Shape及其派生类Rectangle-importstd.s......
  • C++类与继承
    C++类有三种访问修饰符:public(共有的)、private(私有的)、protected(受保护的)类内各区域成员的访问:1、public类内成员函数、类外、友元函数都可以访问。2、private类内成员函数、友元函数可以访问,private区域成员不能在派生类中访问。3、protected与private不同之......
  • 43.继承
    继承继承是面向对象编程中的三大概念之二,指的是一个类基于另一个类来创建。创建出来的新类称为子类或派生类。被继承的类称为父类或基类。通过继承,子类可以继承父类的属性和方法,并且可以在此基础上添加新的属性和方法,或者对继承的属性和方法进行修改。继承的主要特点包括:继......