跳至主要內容
  • Hostloc 空間訪問刷分
  • 售賣場
  • 廣告位
  • 賣站?

4563博客

全新的繁體中文 WordPress 網站
  • 首頁
  • golang 的组合是一个虚假的继承~~~
未分類
29 3 月 2021

golang 的组合是一个虚假的继承~~~

golang 的组合是一个虚假的继承~~~

資深大佬 : seth19960929 0

今天写代码遇到了一个坑:

package main  import "fmt"  type Person interface {  Say()  Name() }  type Parent struct { }  func (s *Parent) Say() {  fmt.Println("i am " + s.Name()) }  func (s *Parent) Name() string {  return "parent" }  type Child struct {  Parent }  func (s *Child) Name() string {  return "child" }  func main() {   var c Child  // i am parent  c.Say()   c1 := &Child{}     // i am parent     c1.Say() }  

这个输出 // i am parent, 感觉 go 的组合真的和继承没有任何关系.

大佬有話說 (10)

  • 資深大佬 : yokyj

    golang 确实是没有真正的继承,但是你这里的问题是在于 Child 没有实现 Say 函数,也就是没有实现 person 接口

  • 資深大佬 : anonydmer

    接口根本没用上,而且 Name() 函数接口和实现中签名也不一致

  • 資深大佬 : jasonkayzk

    首先,你的 interface 写的有问题,Name() 函数应该是有返回值的,否则下面的 struct 是没有实现这个接口的:

    “`go
    type Person interface {
    Say()
    Name() string
    }
    “`

    其次,要注意 Go 里面只有 “组合”(类似于 Spring 框架里面通过组合进行依赖注入?),没有继承;

    在组合的时候,子 struct 会保留原来父 struct 中的方法(除非子类重写这个方法);并且 Go 中的方法(或者说函数)只有 Receiver 的说法,而不是属于某个类或者子类!

    所以,当子类 Child 调用 Say 方法的时候,由于 Child 本身没有实现 Child 方法,所以会调用到 Child 组合而来的 Parent ;
    如果你给 Parent 成员变量取个名字,例如:

    “`go
    type Child struct {
    p Parent
    }
    “`

    其实他调用的是 c.p.Name();

    大概这样。

  • 資深大佬 : cmdOptionKana

    真正的继承有很多问题,因此比较新的语言都看轻了继承,一些老语言也增加非继承的组合的支持。

  • 資深大佬 : tabris17

    是你的代码有问题,s.Name()调用是静态绑定的,如果此处要实现动态分发,那就要先实现一个包含 Name()方法的 named 接口,然后把 s 转换成接口再调用

  • 資深大佬 : rrfeng

    你这个 Person 没有任何卵用(逃

  • 主 資深大佬 : seth19960929

    @yokyj 是呀
    @anonydmer 忽略我的错误. 改正了
    @jasonkayzk 已修正
    @cmdOptionKana 比如说?

  • 主 資深大佬 : seth19960929

    @rrfeng 因为我在别的方法需要使用 Person 接口, 只是实例代码没用

  • 主 資深大佬 : seth19960929

    @tabris17 我要表达的是组合的方式, 和接口无关. 我的其他代码没给. 一样是用 Person 接口去调用.

  • 資深大佬 : tabris17

    @seth19960929 组合就用显式调用,4 已经说了。如果要实现动态分发(多态)就得用接口

文章導覽

上一篇文章
下一篇文章

AD

其他操作

  • 登入
  • 訂閱網站內容的資訊提供
  • 訂閱留言的資訊提供
  • WordPress.org 台灣繁體中文

51la

4563博客

全新的繁體中文 WordPress 網站
返回頂端
本站採用 WordPress 建置 | 佈景主題採用 GretaThemes 所設計的 Memory
4563博客
  • Hostloc 空間訪問刷分
  • 售賣場
  • 廣告位
  • 賣站?
在這裡新增小工具