package main
import (
"fmt"
"math"
)
// Shape 接口定义了计算面积的方法
type Shape interface {
Area() float64
}
// Circle 结构体表示圆形
type Circle struct {
Radius float64
}
// Area 方法计算圆形的面积
func (c Circle) Area() float64 {
return math.Pi * c.Radius * c.Radius
}
// Rectangle 结构体表示矩形
type Rectangle struct {
Width float64
Height float64
}
// Area 方法计算矩形的面积
func (r Rectangle) Area() float64 {
return r.Width * r.Height
}
// TotalArea 函数计算形状切片的总面积
func TotalArea(shapes []Shape) float64 {
var total float64
for _, shape := range shapes {
total += shape.Area()
}
return total
}
- 多态性的实现:
- 在Go语言中,虽然没有传统面向对象语言中的类继承体系,但通过接口实现了多态。
Circle
和 Rectangle
结构体都实现了 Shape
接口的 Area
方法。TotalArea
函数接受一个 Shape
接口类型的切片作为参数。在函数内部,通过 shape.Area()
调用不同结构体的 Area
方法,具体调用哪个方法取决于 shape
实际指向的结构体类型(是 Circle
还是 Rectangle
)。这就是多态性的体现,同一个接口类型的变量可以在运行时表现出不同的行为。
- 这样设计的好处:
- 可扩展性:如果需要添加新的形状,比如
Triangle
,只需要创建 Triangle
结构体并实现 Shape
接口的 Area
方法,TotalArea
函数无需修改即可处理新的形状。
- 代码复用:
TotalArea
函数可以处理任何实现了 Shape
接口的类型,而不需要为每种形状都写一个特定的计算总面积的函数,提高了代码的复用性。
- 松耦合:各个形状结构体和
TotalArea
函数之间通过接口进行交互,降低了它们之间的耦合度。形状结构体的实现细节可以改变,只要它依旧实现了 Shape
接口,TotalArea
函数就不受影响。