接口
假设我有一个HUAWEI类,要实现Phone接口,可以这样做:
package main
import "fmt"
//定义一个接口
type Phone interface {
call()
}
//定义一个类
type HUAWEI struct {
name string
}
//用上面的HUAWEI类实现上面的Phone接口
func (myPhone HUAWEI) call() {
fmt.Println("this is the coolest phone all around the world")
}
func main() {
thisPhone := new(HUAWEI)
thisPhone.call()
}
多态
Go的多态可以用接口实现,所谓多态就是同一个接口下,不同对象的不同表现,
比如我们想用多态的方式实现购买一台MacBook和Apple Watch可以这样写:
- 定义商品的接口
- 定义笔记本电脑和手表两个类
- 上面的每一个类都实现一下商品接口(其实所谓的实现接口 就是绑定所有接口声明的方法)
- 创建一个merchandise的切片来表示购物车
- 定义一个函数计算总金额的函数
具体实现代码如下
package main
import (
"fmt"
"strconv"
)
//定义一个接口来表示商品
type Merchandise interface {
totalPrice() int
totalInfo() string
}
//定义两个类 :Laptop 和 Watch
type Laptop struct {
brand string
quantity int
price int
}
type Watch struct {
brand string
quantity int
price int
}
//上面的每一个类都实现一下Merchandise接口(其实所谓的实现接口 就是绑定所有接口声明的方法)
func (laptop Laptop) totalPrice() int {
return laptop.price * laptop.quantity
}
func (laptop Laptop) totalInfo() string {
return `your order contains ` + strconv.Itoa(laptop.quantity) + ` ` + laptop.brand + ` total: ` + strconv.Itoa(laptop.totalPrice()) + ` RMB`
}
func (watch Watch) totalPrice() int {
return watch.price * watch.quantity
}
func (watch Watch) totalInfo() string {
return `your order contains ` + strconv.Itoa(watch.quantity) + ` ` + watch.brand + ` total: ` + strconv.Itoa(watch.totalPrice()) + ` RMB`
}
//定义一个函数计算总金额的函数
func calculateTotalPrice(merchandise []Merchandise) int {
var finalPrice int
for _, item := range merchandise {
fmt.Println(item.totalInfo())
finalPrice += item.totalPrice()
}
return finalPrice
}
func main() {
// 实例化两个类
macBook := Laptop{
brand: "Apple-macbook",
quantity: 1,
price: 20000,
}
appleWatch := Watch{
brand: "AppleWatch",
quantity: 1,
price: 5000,
}
// 创建一个merchandise的切片来表示购物车
shoppingCart := []Merchandise{macBook, appleWatch}
// 计算总价
finalTotalPrice := calculateTotalPrice(shoppingCart)
fmt.Println("All you Need to pay is: ", finalTotalPrice, " RMB")
}
注意
package main
import "fmt"
func main() {
a := 10
switch interface{}(a).(type) {
case int:
fmt.Println("参数的类型是 int")
case string:
fmt.Println("参数的类型是 string")
}
}