📅  最后修改于: 2023-12-03 14:41:34.679000             🧑  作者: Mango
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
接口,并由 Rectangle
和 Circle
两个结构体实现该接口的属性及方法。 Rectangle
结构体有 Width
和 Height
两个字段,来表示矩形的形状。 Circle
结构体只有一个 Radius
字段,来表示圆形的半径。
接下来,我们在 Rectangle
和 Circle
结构体上分别实现了 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 代码更加灵活,更加易于维护和重构,同时也更加符合现代代码设计的趋势。