MST

星途 面试题库

面试题:TypeScript类多态在复杂场景下的应用与优化

假设有一个游戏开发场景,存在一个基类`Character`,包含基本属性和方法,如`name`、`health`以及`attack`方法。有三个子类`Warrior`、`Mage`和`Archer`继承自`Character`,它们重写`attack`方法实现不同的攻击方式。同时,游戏中有一个战斗系统,会动态生成不同类型的角色并进行战斗。请使用TypeScript设计一个高效的架构来管理这些角色,包括角色的创建、存储和战斗逻辑,确保多态的正确应用,并优化代码以提高性能和可维护性。阐述你设计中的关键思路与优化点。
39.2万 热度难度
前端开发TypeScript

知识考点

AI 面试

面试题答案

一键面试

关键思路

  1. 类继承与多态:通过Character基类定义通用属性和方法,WarriorMageArcher子类继承并重写attack方法实现多态,这样战斗系统可以统一处理不同类型角色的攻击逻辑。
  2. 工厂模式:使用工厂模式创建角色实例,将角色创建逻辑封装起来,提高代码的可维护性和可扩展性,便于新增角色类型。
  3. 数据存储与管理:使用数组或更复杂的数据结构存储角色实例,便于统一管理和操作。

优化点

  1. 减少重复代码:将通用逻辑放在基类,子类只关注自身特有的实现,降低代码冗余。
  2. 提高可维护性:通过工厂模式和清晰的类层次结构,使代码结构更清晰,易于理解和修改。
  3. 性能优化:合理选择数据结构存储角色,如使用数组遍历查找角色时,可根据场景复杂度考虑使用哈希表等更高效的数据结构提高查找效率。

代码实现

// 基类Character
class Character {
    name: string;
    health: number;
    constructor(name: string, health: number) {
        this.name = name;
        this.health = health;
    }
    attack(): string {
        return `${this.name} 进行普通攻击`;
    }
}

// 子类Warrior
class Warrior extends Character {
    attack(): string {
        return `${this.name} 挥舞宝剑进行攻击`;
    }
}

// 子类Mage
class Mage extends Character {
    attack(): string {
        return `${this.name} 释放魔法进行攻击`;
    }
}

// 子类Archer
class Archer extends Character {
    attack(): string {
        return `${this.name} 拉弓射箭进行攻击`;
    }
}

// 角色工厂
class CharacterFactory {
    createCharacter(type: string, name: string, health: number): Character {
        switch (type) {
            case 'Warrior':
                return new Warrior(name, health);
            case 'Mage':
                return new Mage(name, health);
            case 'Archer':
                return new Archer(name, health);
            default:
                throw new Error('不支持的角色类型');
        }
    }
}

// 战斗系统
class BattleSystem {
    characters: Character[] = [];
    factory: CharacterFactory;
    constructor() {
        this.factory = new CharacterFactory();
    }
    addCharacter(type: string, name: string, health: number) {
        const character = this.factory.createCharacter(type, name, health);
        this.characters.push(character);
    }
    startBattle() {
        this.characters.forEach(character => {
            console.log(character.attack());
        });
    }
}

// 使用示例
const battleSystem = new BattleSystem();
battleSystem.addCharacter('Warrior', '战士1', 100);
battleSystem.addCharacter('Mage', '法师1', 80);
battleSystem.addCharacter('Archer', '弓箭手1', 90);
battleSystem.startBattle();