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() }

我們可以這樣解決衝突的問題。這段程式碼是否被推薦是個疑問。

怎么使用

从个人的角度来看,我会按照以下的顺序进行思考。

    1. 这个结构体的成员吗?(仅在内部逻辑中使用)

 

    1. 是一个别名吗?(如果仅仅是复制或扩展一个简单类型)

 

    是嵌入类型吗?(同时扩展类型并需要使用super和其他成员)

我认为首先使用has_a将是一个不错的选择。
对于类型扩展的情况,首先考虑使用别名。
嵌入类型应该只用于超过上述要求的情况。

我认为,alias相对来说可以比较随意地使用,但是像嵌入式一样,在使用时应该像面向对象中继承的利弊讨论一样谨慎。

广告
将在 10 秒后关闭
bannerAds