Go 中的继承

为什么 Go 没有类型继承。

(定义一个对象的类时,定义的任何子类都可以继承一个或多个通用类的定义的概念)


慕尼黑8549860
浏览 145回答 3
3回答

手掌心

这是由常见问题解答中的语言创建者回答的:面向对象的编程,至少在最著名的语言中,涉及对类型之间关系的过多讨论,这些关系通常可以自动派生。Go 采取了不同的方法。与其要求程序员提前声明两种类型是相关的,在 Go 中,类型会自动满足任何指定其方法子集的接口。除了减少簿记,这种方法还有真正的优势。类型可以同时满足多个接口,没有传统多重继承的复杂性。接口可以是非常轻量级的——具有一个甚至零方法的接口可以表达一个有用的概念。如果出现新想法或用于测试,可以事后添加接口——无需注释原始类型。因为类型和接口之间没有明确的关系,所以没有类型层次结构需要管理或讨论。另请参阅:组合优于继承原则。

三国纷争

如果你需要继承来重用,这个例子展示了我如何重用形状界面的宽度/高度,package main// compare to a c++ example: http://www.tutorialspoint.com/cplusplus/cpp_interfaces.htmimport (    "fmt")// interfacetype Shape interface {    Area() float64    GetWidth() float64    GetHeight() float64    SetWidth(float64)    SetHeight(float64)}// reusable part, only implement SetWidth and SetHeight method of the interface// {type WidthHeight struct {    width  float64    height float64}func (this *WidthHeight) SetWidth(w float64) {    this.width = w}func (this *WidthHeight) SetHeight(h float64) {    this.height = h}func (this *WidthHeight) GetWidth() float64 {    return this.width}func (this *WidthHeight) GetHeight() float64 {    fmt.Println("in WidthHeight.GetHeight")    return this.height}// }type Rectangle struct {    WidthHeight}func (this *Rectangle) Area() float64 {    return this.GetWidth() * this.GetHeight() / 2}// overridefunc (this *Rectangle) GetHeight() float64 {    fmt.Println("in Rectangle.GetHeight")    // in case you still needs the WidthHeight's GetHeight method    return this.WidthHeight.GetHeight()}func main() {    var r Rectangle    var i Shape = &r    i.SetWidth(4)    i.SetHeight(6)    fmt.Println(i)    fmt.Println("width: ",i.GetWidth())    fmt.Println("height: ",i.GetHeight())    fmt.Println("area: ",i.Area())}结果:&{{4 6}}width:  4in Rectangle.GetHeightin WidthHeight.GetHeightheight:  6in Rectangle.GetHeightin WidthHeight.GetHeightarea:  12

白衣非少年

我认为嵌入足够接近定义:package mainimport "net/url"type address struct { *url.URL }func newAddress(rawurl string) (address, error) {   p, e := url.Parse(rawurl)   if e != nil {      return address{}, e   }   return address{p}, nil}func main() {   a, e := newAddress("https://stackoverflow.com")   if e != nil {      panic(e)   }   { // inherit      s := a.String()      println(s)   }   { // fully qualified      s := a.URL.String()      println(s)   }}https://golang.org/ref/spec#Struct_types
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go