Golang: 内嵌真的不是继承 (1)

可以使用 embedded 对象的字段和方法,就好自己的一样;但是,毕竟不是继承。

专栏的介绍可以参考 《GotchaGolang专栏》,代码可以看《宝库-Gotcha》

Golang 没有继承大家都知道,但是就是面不了拿内嵌对象当做继承结构用。

案例

直接上代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
package main


import "fmt"

type parent struct {
name string
}

func (p *parent) Info() string {
return fmt.Sprintf("Name: %s", p.name)
}

type child struct {
parent
//other fileds
}

func getInfo(p *parent) string {
return p.Info()
}

func main() {
c := &child {
parent : parent {
name: "TheChild",
},
// other fields
}

fmt.Println(c.Info()) //child using parent method Info
fmt.Println(c.name) //child using parent field name
}

但是 child 对象调用 getInfo 方法就会编译报错,毕竟不是 parent 类型,也不会强制类型转换:

1
fmt.Println(getInfo(c))

报错: cannot use c (type *child) as type *parent in argument to getInfo

这个时候,还是用 interface{} 吧,内部再做运行时类型检查就可以了。

总结

虽然内嵌类型可以当做继承来看待,多数时候也适用;但是内嵌毕竟不是继承。组合就是组合


Merlin 2018.3 内嵌的坑

文章目录
  1. 1. 案例
  2. 2. 总结
|