MST

星途 面试题库

面试题:TypeScript类继承与组合设计模式的基础差异

请简要阐述在TypeScript中,类的继承和组合设计模式在实现和应用场景上有哪些主要差异。并分别举例说明,如何使用继承和组合来构建一个简单的用户权限管理模块,模块至少包含基本的权限检查功能。
46.5万 热度难度
前端开发TypeScript

知识考点

AI 面试

面试题答案

一键面试

类的继承和组合设计模式的主要差异

  1. 实现方式
    • 继承:通过extends关键字实现,子类继承父类的属性和方法,子类可以重写父类的方法,也可以添加新的属性和方法。
    • 组合:通过在一个类中包含另一个类的实例来实现,通过调用包含实例的方法来实现功能。
  2. 应用场景
    • 继承:适用于有明确的“是一种”(is - a)关系的场景,例如,管理员用户“是一种”用户,此时可以用继承。它强调代码的复用,子类可以直接复用父类的代码。
    • 组合:适用于有“有一个”(has - a)关系的场景,例如,用户“有一个”权限集合,更强调灵活性和可维护性,因为组合对象之间耦合度相对较低。

使用继承构建用户权限管理模块

// 基类:用户
class User {
    constructor(public username: string) {}
    checkPermission(permission: string): boolean {
        // 这里只是简单示例,实际可以有更复杂逻辑
        return false;
    }
}

// 子类:管理员用户,继承自User
class AdminUser extends User {
    constructor(username: string) {
        super(username);
    }
    checkPermission(permission: string): boolean {
        // 管理员用户可以有不同的权限检查逻辑
        return true;
    }
}

使用组合构建用户权限管理模块

// 权限类
class Permission {
    checkPermission(permission: string): boolean {
        // 这里只是简单示例,实际可以有更复杂逻辑
        return false;
    }
}

// 用户类,通过组合使用Permission类
class User {
    constructor(public username: string, private permission: Permission) {}
    checkPermission(permission: string): boolean {
        return this.permission.checkPermission(permission);
    }
}

// 管理员权限类,继承自Permission
class AdminPermission extends Permission {
    checkPermission(permission: string): boolean {
        return true;
    }
}

// 创建管理员用户时使用AdminPermission实例
let adminPermission = new AdminPermission();
let adminUser = new User('admin', adminPermission);