package main
import (
"fmt"
)
// Shape 接口定义计算面积的方法
type Shape interface {
Area() float64
}
// Rectangle 接口继承自Shape并新增计算周长的方法
type Rectangle interface {
Shape
Perimeter() float64
}
// Square 结构体实现Rectangle接口
type Square struct {
Side float64
}
// Area 实现Shape接口的面积计算方法
func (s Square) Area() float64 {
return s.Side * s.Side
}
// Perimeter 实现Rectangle接口的周长计算方法
func (s Square) Perimeter() float64 {
return 4 * s.Side
}
// 接受interface{}类型参数,判断是否实现Rectangle接口并调用方法
func processShape(i interface{}) {
if r, ok := i.(Rectangle); ok {
fmt.Printf("Area: %.2f, Perimeter: %.2f\n", r.Area(), r.Perimeter())
} else {
fmt.Println("The parameter does not implement the Rectangle interface.")
}
}
func main() {
// 创建Square实例
square := Square{Side: 5}
// 调用processShape函数
processShape(square)
// 通过多态在切片中存储不同实现Rectangle接口的结构体
var rectangles []Rectangle
rectangles = append(rectangles, square)
// 遍历切片并调用相应方法
for _, r := range rectangles {
fmt.Printf("Area: %.2f, Perimeter: %.2f\n", r.Area(), r.Perimeter())
}
}
- 接口与结构体定义:
- 定义了
Shape
接口,包含Area
方法。
Rectangle
接口继承自Shape
,并新增Perimeter
方法。
Square
结构体实现了Rectangle
接口。
processShape
函数:
- 使用类型断言
i.(Rectangle)
判断传入的interface{}
类型参数是否实现了Rectangle
接口。
- 如果实现了,则调用
Area
和Perimeter
方法并打印结果。
- 多态的实现:
- 在
main
函数中,创建Square
实例,并将其存储在Rectangle
类型的切片中。
- 遍历切片,通过多态调用每个元素的
Area
和Perimeter
方法。