Go 用 interface 模拟多态

原创
2017/07/13 20:21
阅读数 104

多态是 C++ 这种语言中的概念,是指对不同的子类对象运行自己定义的方法。在 Go 语言中没有类的概念,但仍然可以使用 struct + interface 来模拟实现类的功能。下面这个例子演示如何使用 Go 来模拟 C++ 中的多态行为。

package main 

import "fmt"

// 首先定义了一个 Shaper 接口,它有一个 Area() 方法
type Shaper interface {
	Area() float32
}

// 定义 Square 结构体
type Square struct {
	side float32
}

// 定义一个方法,方法的接受者是 Square* 的对象。
// 可以看作是 Square 的一个成员函数,而这个方法又是实现 Shaper 接口的。
// 类似于  C++ 中继承并实现 Shaper。
func (sq *Square) Area() float32 {
	return sq.side * sq.side
}

// 定义 Rectangel 结构体
type Rectangle struct {
	length, width float32
}

// 定义一个方法,方法的接受者是 Rectangle 的对象。
// 可以看作是 Rectangle 的一个成员函数,而这个方法又是实现 Shaper 接口的。
// 类似于  C++ 中继承并实现 Shaper。
func (r Rectangle) Area() float32 {
	return r.length * r.width
}

func main() {
	rect := Rectangle{5, 3}
	squa := &Square{5}

	shapes := []Shaper{rect, squa}
	fmt.Println("Looping through shapes for area...")

	for n, _:= range shapes {
		fmt.Println("Shape details: ", shapes[n])
		fmt.Println("Area of this shape is: ", shapes[n].Area())
	}
}

最后 shapers 调用 Area() 方法时,调用了各自实现的逻辑。这就模拟出了多态。

展开阅读全文
打赏
0
0 收藏
分享
加载中
更多评论
打赏
0 评论
0 收藏
0
分享
返回顶部
顶部