Golang – 常用设计 Inheritance Pattern
在 Golang中,并没有传统OOP语言中的Classs和Inherit的概念。Golang通过Interface和Struct的定义来实现代码复用。
以下是代码案例
- 定义好标准的Position Type 和Position所需要用的function
// Position 结构体表示一个二维坐标的位置
type Position struct {
x float64
y float64
}
// Move 方法用于移动当前位置的坐标
func (this *Position) Move(moveX, moveY float64) {
this.x += moveX
this.y += moveY
}
// Teleport 方法用于将当前位置的坐标瞬间移动到指定位置
func (this *Position) Teleport(moveX, moveY float64) {
this.x = moveX
this.y = moveY
}
2. 定义好Player,并且继承了Position的功能
// Player 结构体表示一个玩家,包含一个指向 Position 的指针
type Player struct {
*Position
}
// NewPlayer 函数用于创建一个新的玩家对象
func NewPlayer() *Player {
return &Player{
Position: &Position{}, // 初始化玩家的位置 (value : key必须同样名字)
}
}
3. 定义好SecialPosition,并且继承了Position
注意:由于父Struct已经有Move function了,如果子Struct也有Move的话就会覆盖原有父Struct当中的Move function了
// SpecialPosition 结构体继承自 Position,表示一个特殊的位置
type SpecialPosition struct {
Position // 匿名字段,继承自 Position 结构体
}
// SpecialMove 方法用于特殊移动,将当前位置坐标分别平方
func (this *SpecialPosition) SpecialMove(moveX, moveY float64) {
this.x += (moveX * moveX)
this.y += (moveY * moveY)
}
4. 定义好Enermy Type并且Enermy继承了SpecialPosition的能力
// Enermy 结构体表示一个敌人,包含一个指向 SpecialPosition 的指针
type Enermy struct {
*SpecialPosition
}
// NewEnermy 函数用于创建一个新的敌人对象
func NewEnermy() *Enermy {
return &Enermy{
SpecialPosition: &SpecialPosition{}, // 初始化敌人的特殊位置 (value : key必须同样名字)
}
}
5. 以下是使用案例
– Player只是继承了基础Position所以只有Move的能力
– Enermy继承了SpecialPostion, 而且SpecialPostion也继承了基础Position,所以Enermy不止能用Move,而且还能用SpecialMove
func main() {
// 创建一个新玩家并移动位置
Player1 := NewPlayer()
Player1.Move(2, 2)
fmt.Println("Player1 Position:", Player1.Position)
// 创建一个新敌人并移动位置,然后进行特殊移动
Enermy1 := NewEnermy()
Enermy1.Move(10, 10)
fmt.Println("Enermy1 Position:", Enermy1.Position)
Enermy1.SpecialMove(3, 3)
fmt.Println("Enermy1 Position:", Enermy1.Position)
}
输出结果:
Player1 Position: &{2 2}
Enermy1 Position: {10 10}
Enermy1 Position: {19 19}
注意:如果子类当中有variable或者function和父类是同名的话就会被覆盖
Facebook评论