接口名称: Unit
父类名称: Obj
子类1名称: craeture
子类2名称: player
- 将2个子类继承Obj父类.
- 依次实现子类player和creature的接口, 接口名称和返回值要求和Unit 保持一致,并且要求全部实现,这样才可以继承interface接口
- 编写一个形参为 Unit对象的函数show(), 用于调用打印子类信息. 这样可以更直观的理解继承Unit interface.
- main里创建Unit对象并初始化.
- 将Unit对象扔到show()里边,查看打印信息.
这样的继承方式符合开闭原则
即便在增加其他子类,也不需要关注之前的代码.不会影响之前代码.
package main
import "fmt"
// 接口
type Unit interface {
GetName() string
GetLevel() int
GetHp() int
}
// 对象类
type Obj struct {
name string
level int
hp int
}
// 生物类
type creature struct {
Obj //继承对象类
}
func (c *creature) GetName() string {
return c.name
}
func (c *creature) GetLevel() int {
return c.level
}
func (c *creature) GetHp() int {
return c.hp
}
// 玩家类
type player struct {
Obj
}
func (c *player) GetName() string {
return c.name
}
func (c *player) GetLevel() int {
return c.level
}
func (c *player) GetHp() int {
return c.hp
}
//统一show
func show(u Unit) {
fmt.Printf("名字:%s\n", u.GetName())
fmt.Printf("等级:%d\n", u.GetLevel())
fmt.Printf("血量:%d\n", u.GetHp())
}
func main() {
var c Unit //创建Unit对象, 目前指针指向空
c = &creature{Obj{ //将Unit对象初始化
name: "生物1",
level: 101,
hp: 10001,
}}
show(c) //统一接口show
fmt.Println("---------------------")
var p Unit
p = &player{Obj{
name: "玩家1",
level: 102,
hp: 10002,
}}
show(p)
}
打印结果:
名字:生物1
等级:101
血量:10001
---------------------
名字:玩家1
等级:102
血量:10002