Golang – 常用设计 Inheritance Pattern

在 Golang中,并没有传统OOP语言中的Classs和Inherit的概念。Golang通过Interface和Struct的定义来实现代码复用。

以下是代码案例

  1. 定义好标准的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和父类是同名的话就会被覆盖

Loading

Facebook评论