MST

星途 面试题库

面试题:Go语言接口与多态在复杂业务场景下的设计

假设你正在开发一个游戏框架,游戏中有多种角色,如战士(Warrior)、法师(Mage)、刺客(Assassin)等。每个角色都有基本的行动(如移动、攻击),并且不同角色的行动方式有所不同。请使用Go语言的接口和多态特性设计一个通用的角色管理模块,使得可以方便地添加新角色类型,同时保证不同角色的行动逻辑能够正确实现和调用。要求详细说明设计思路,并给出关键代码示例。
50.5万 热度难度
编程语言Go

知识考点

AI 面试

面试题答案

一键面试

设计思路

  1. 定义接口:创建一个通用的接口,包含所有角色共有的方法,如移动和攻击。这样不同的角色类型只要实现这个接口,就可以通过该接口进行统一管理。
  2. 实现角色结构体及接口方法:为每个具体角色(战士、法师、刺客等)创建结构体,并为这些结构体实现接口中定义的方法,以实现多态。
  3. 角色管理模块:创建一个角色管理模块,通过接口类型的切片来存储不同的角色实例,方便对所有角色进行统一操作。

关键代码示例

package main

import "fmt"

// 定义角色接口
type Character interface {
    Move()
    Attack()
}

// 战士结构体
type Warrior struct {
    Name string
}

// 战士移动方法
func (w Warrior) Move() {
    fmt.Printf("%s 战士正在移动\n", w.Name)
}

// 战士攻击方法
func (w Warrior) Attack() {
    fmt.Printf("%s 战士正在进行近战攻击\n", w.Name)
}

// 法师结构体
type Mage struct {
    Name string
}

// 法师移动方法
func (m Mage) Move() {
    fmt.Printf("%s 法师正在移动\n", m.Name)
}

// 法师攻击方法
func (m Mage) Attack() {
    fmt.Printf("%s 法师正在释放魔法攻击\n", m.Name)
}

// 刺客结构体
type Assassin struct {
    Name string
}

// 刺客移动方法
func (a Assassin) Move() {
    fmt.Printf("%s 刺客正在潜行移动\n", a.Name)
}

// 刺客攻击方法
func (a Assassin) Attack() {
    fmt.Printf("%s 刺客正在进行暗杀攻击\n", a.Name)
}

// 角色管理模块
type CharacterManager struct {
    Characters []Character
}

// 添加角色到管理模块
func (cm *CharacterManager) AddCharacter(c Character) {
    cm.Characters = append(cm.Characters, c)
}

// 让所有角色执行移动和攻击动作
func (cm *CharacterManager) PerformActions() {
    for _, char := range cm.Characters {
        char.Move()
        char.Attack()
    }
}

你可以通过以下方式使用这些代码:

func main() {
    manager := CharacterManager{}

    warrior := Warrior{Name: "大壮"}
    mage := Mage{Name: "哈利"}
    assassin := Assassin{Name: "小李"}

    manager.AddCharacter(warrior)
    manager.AddCharacter(mage)
    manager.AddCharacter(assassin)

    manager.PerformActions()
}