MST

星途 面试题库

面试题:Go组合类型在复杂业务场景下的类型嵌入与方法重写

假设你正在开发一个游戏引擎,有一个基础的 `GameObject` 结构体,包含通用的属性和方法,如位置、名称等。现在有 `Player` 和 `Enemy` 结构体,它们基于 `GameObject` 进行组合扩展。`Player` 有一个特殊的 `Attack` 方法,`Enemy` 也有 `Attack` 方法但实现不同。请描述这种场景下如何通过组合来设计类型结构,并且处理可能出现的方法重写问题,给出关键代码片段。
43.6万 热度难度
编程语言Go

知识考点

AI 面试

面试题答案

一键面试
  1. 通过组合设计类型结构
    • 首先定义基础的 GameObject 结构体,包含通用属性和方法。
    • 然后 PlayerEnemy 结构体通过组合 GameObject 结构体来扩展功能。
    • 在Go语言中的示例代码如下:
package main

import "fmt"

// GameObject 基础游戏对象结构体
type GameObject struct {
    Name string
    Position struct {
        X, Y float32
    }
}

// Player 玩家结构体,通过组合GameObject扩展
type Player struct {
    GameObject
}

// Attack 玩家的攻击方法
func (p *Player) Attack() {
    fmt.Printf("%s 玩家发动攻击\n", p.Name)
}

// Enemy 敌人结构体,通过组合GameObject扩展
type Enemy struct {
    GameObject
}

// Attack 敌人的攻击方法,实现与玩家不同
func (e *Enemy) Attack() {
    fmt.Printf("%s 敌人发动攻击\n", e.Name)
}
  1. 处理方法重写问题
    • 在这种组合的方式下,PlayerEnemyAttack 方法是各自独立定义的,不存在传统继承中的“方法重写”概念。
    • 因为它们通过组合的方式拥有自己独立的 Attack 方法实现,调用时直接通过各自结构体实例调用。
    • 例如:
func main() {
    player := Player{
        GameObject: GameObject{
            Name: "玩家1",
            Position: struct {
                X, Y float32
            }{X: 10, Y: 10},
        },
    }
    enemy := Enemy{
        GameObject: GameObject{
            Name: "敌人1",
            Position: struct {
                X, Y float32
            }{X: 20, Y: 20},
        },
    }
    player.Attack()
    enemy.Attack()
}

在上述代码中,PlayerEnemy 各自实现了自己的 Attack 方法,通过各自的实例调用,不会出现混淆,也就不需要处理传统继承中的方法重写冲突问题。