为了账号安全,请及时绑定邮箱和手机立即绑定

Go 中的继承

Go 中的继承

Go
慕尼黑8549860 2021-11-29 15:32:47
为什么 Go 没有类型继承。(定义一个对象的类时,定义的任何子类都可以继承一个或多个通用类的定义的概念)
查看完整描述

3 回答

?
手掌心

TA贡献1942条经验 获得超3个赞

这是由常见问题解答中的语言创建者回答的:

面向对象的编程,至少在最著名的语言中,涉及对类型之间关系的过多讨论,这些关系通常可以自动派生。Go 采取了不同的方法。

与其要求程序员提前声明两种类型是相关的,在 Go 中,类型会自动满足任何指定其方法子集的接口。除了减少簿记,这种方法还有真正的优势。类型可以同时满足多个接口,没有传统多重继承的复杂性。接口可以是非常轻量级的——具有一个甚至零方法的接口可以表达一个有用的概念。如果出现新想法或用于测试,可以事后添加接口——无需注释原始类型。因为类型和接口之间没有明确的关系,所以没有类型层次结构需要管理或讨论。

另请参阅:组合优于继承原则

查看完整回答
反对 回复 2021-11-29
?
三国纷争

TA贡献1804条经验 获得超7个赞

如果你需要继承来重用,这个例子展示了我如何重用形状界面的宽度/高度,


package main


// compare to a c++ example: http://www.tutorialspoint.com/cplusplus/cpp_interfaces.htm


import (

    "fmt"

)


// interface

type 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

}


// override

func (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:  4

in Rectangle.GetHeight

in WidthHeight.GetHeight

height:  6

in Rectangle.GetHeight

in WidthHeight.GetHeight

area:  12


查看完整回答
反对 回复 2021-11-29
?
白衣非少年

TA贡献1155条经验 获得超0个赞

我认为嵌入足够接近定义:


package main

import "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


查看完整回答
反对 回复 2021-11-29
  • 3 回答
  • 0 关注
  • 144 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信