golang中的继承
引入
我研究了一下类似于Go语言对象导向的功能。
别名
type myInt int
这就是那种情况。这是原始类型的别名。
它是不同于原始类型的另一种类型,但可以相互转换如下。
var i int = 1
var j myInt = myInt(i)
var k int = int(j)
如果给别名,您可以自由地添加功能(方法)。
与不能继承或添加功能(如Java中的内置类型java.lang)相比,这让人感受到了Go语言的自由。
var myInt int
func (i myInt) String() string {
return fmt.Sprintf("myInt --- %d", i)
}
这个功能在枚举中经常被使用。
type MyType int
const (
A MyType = iota
B MyType
C MyType
)
顺便说一下,如果你想要super的话,
func (i MyType) String() string {
j := OrigType(i)
return "MyType" + j.String()
}
可以以类似这样的方式获取。有点麻烦,但是可以。
植入式的
type MyInt struct {
int
}
MyInt在具有int元素的同时,也具有int的功能。
与别名不同的是,
-
- 多重継承できる
-
- superにアクセスするのが簡単
- 継承元以外の要素を含める
我认为应该是这样的。
如果通过多重继承导致方法冲突,除非解决冲突,否则会导致编译错误。
type A struct {}
type B struct {}
func (*A) Hoge() string { return "A" }
func (*B) Hoge() string { return "B" }
// CはAとBを継承(埋め込み)
type C struct {
A
B
}
func (c *C) Hoge() string { return c.A.Hoge() + c.B.Hoge() }
我們可以這樣解決衝突的問題。這段程式碼是否被推薦是個疑問。
怎么使用
从个人的角度来看,我会按照以下的顺序进行思考。
-
- 这个结构体的成员吗?(仅在内部逻辑中使用)
-
- 是一个别名吗?(如果仅仅是复制或扩展一个简单类型)
- 是嵌入类型吗?(同时扩展类型并需要使用super和其他成员)
我认为首先使用has_a将是一个不错的选择。
对于类型扩展的情况,首先考虑使用别名。
嵌入类型应该只用于超过上述要求的情况。
我认为,alias相对来说可以比较随意地使用,但是像嵌入式一样,在使用时应该像面向对象中继承的利弊讨论一样谨慎。