📜  GoLang 中的继承(1)

📅  最后修改于: 2023-12-03 14:41:34.679000             🧑  作者: Mango

GoLang 中的继承

GoLang 是一门现代化的编程语言,它从其他编程语言中借鉴了很多编程概念和思想。在 GoLang 中,我们没有传统面向对象编程语言中的经典继承(Class Inheritance)机制,反而采用了更为灵活的接口继承(Interface Inheritance)机制。

接口继承

在 GoLang 中,继承是通过接口实现来实现的。接口嵌套被广泛认为是 GoLang 这种语言的继承机制,它允许实现类型从接口类型继承行为,尽管另外一名GoLang 开发者可能会认为这不是经典的继承。可以通过嵌套一个接口类型到另一个接口类型来实现接口继承。

type Person interface {
    Name() string
    Age() int
}

type Student interface {
    Person
    Grade() string
}

在上面的代码中,我们定义了一个 Person 接口。接下来,我们使用 Person 接口嵌套到 Student 接口中,这意味着 Student 接口继承了 Person 接口的所有方法和属性,只需要再加上它自己的方法。

现在我们可以在 Student 接口中实现 Grade 方法而无需在其中实现 Name()Age() 方法,因为这些方法已经被 Person 接口继承过来了。

示例

让我们看一个更完整的示例,来演示使用 GoLang 的"继承"机制实现一个基本的图形形状接口。

type Shape interface {
    Perimeter() float64
    Area() float64
}

type Rectangle struct {
    Width, Height float64
}

type Circle struct {
    Radius float64
}

func (r Rectangle) Perimeter() float64 {
    return 2 * (r.Width + r.Height)
}

func (r Rectangle) Area() float64 {
    return r.Width * r.Height
}

func (c Circle) Perimeter() float64 {
    return 2 * math.Pi * c.Radius
}

func (c Circle) Area() float64 {
    return math.Pi * c.Radius * c.Radius
}

在上面的代码中,我们首先定义了 Shape 接口,并由 RectangleCircle 两个结构体实现该接口的属性及方法。 Rectangle 结构体有 WidthHeight 两个字段,来表示矩形的形状。 Circle 结构体只有一个 Radius 字段,来表示圆形的半径。

接下来,我们在 RectangleCircle 结构体上分别实现了 Perimeter()Area() 函数。这两个函数分别计算矩形的周长和面积以及圆形的周长和面积。

最后,我们可以使用这些实现了 Shape 接口的类型,来执行相应的操作。

r := Rectangle{5.0, 4.0}
c := Circle{2.5}

fmt.Println("Rectangle:")
fmt.Println("  width:", r.Width)
fmt.Println("  height:", r.Height)
fmt.Println("  perimeter:", r.Perimeter())
fmt.Println("  area:", r.Area())

fmt.Println("Circle:")
fmt.Println("  radius:", c.Radius)
fmt.Println("  perimeter:", c.Perimeter())
fmt.Println("  area:", c.Area())

最终的输出结果如下:

Rectangle:
  width: 5
  height: 4
  perimeter: 18
  area: 20

Circle:
  radius: 2.5
  perimeter: 15.707963267948966
  area: 19.634954084936208
结论

虽然 GoLang 中没有常见的面向对象编程语言中的经典继承(Class Inheritance)机制,但GoLang的接口继承机制更加灵活,更可控,能解决代码复用的需求。

这里的接口和接口嵌套实际上实现了内嵌对象和接口继承,因此在 GoLang 的继承机制中,传统的私有继承和公有继承等概念无法实现。

总之,GoLang中的继承包括接口嵌套,在结构体中进行组合来复用代码。这样的机制使得 GoLang 代码更加灵活,更加易于维护和重构,同时也更加符合现代代码设计的趋势。