MST

星途 面试题库

面试题:TypeScript中public、private和protected修饰符在类继承中的表现差异

请写出一段TypeScript代码示例,展示一个基类使用public、private和protected修饰符分别修饰属性或方法,然后创建一个子类继承该基类,说明在子类中对这些属性和方法的访问情况,并解释原因。
34.3万 热度难度
前端开发TypeScript

知识考点

AI 面试

面试题答案

一键面试
// 基类
class BaseClass {
    // 公有属性,可以在类内部、子类以及类的实例外部访问
    public publicProperty: string;
    // 私有属性,只能在类内部访问
    private privateProperty: number;
    // 受保护属性,可以在类内部和子类中访问
    protected protectedProperty: boolean;

    constructor(publicProp: string, privateProp: number, protectedProp: boolean) {
        this.publicProperty = publicProp;
        this.privateProperty = privateProp;
        this.protectedProperty = protectedProp;
    }

    // 公有方法,可以在类内部、子类以及类的实例外部访问
    public publicMethod(): void {
        console.log('This is a public method. Public property:', this.publicProperty);
    }

    // 私有方法,只能在类内部访问
    private privateMethod(): void {
        console.log('This is a private method. Private property:', this.privateProperty);
    }

    // 受保护方法,可以在类内部和子类中访问
    protected protectedMethod(): void {
        console.log('This is a protected method. Protected property:', this.protectedProperty);
    }
}

// 子类继承基类
class SubClass extends BaseClass {
    constructor(publicProp: string, privateProp: number, protectedProp: boolean) {
        super(publicProp, privateProp, protectedProp);
    }

    // 子类可以访问公有属性和方法
    public subPublicMethod(): void {
        this.publicMethod();
        console.log('Subclass accessing public property:', this.publicProperty);
    }

    // 子类不能访问私有属性和方法
    // 以下代码会报错:Property 'privateProperty' is private and only accessible within class 'BaseClass'.
    // public subPrivateMethod(): void {
    //     this.privateMethod();
    //     console.log('Subclass accessing private property:', this.privateProperty);
    // }

    // 子类可以访问受保护属性和方法
    public subProtectedMethod(): void {
        this.protectedMethod();
        console.log('Subclass accessing protected property:', this.protectedProperty);
    }
}

// 创建子类实例
const subInstance = new SubClass('public value', 42, true);
subInstance.subPublicMethod();
// subInstance.subPrivateMethod(); // 报错,无法访问
subInstance.subProtectedMethod();

解释

  1. 公有(public):在基类和子类中,以及类的实例外部都可以访问。这是因为 public 修饰符允许属性和方法在任何地方被访问,没有访问限制。
  2. 私有(private):只能在声明它的类内部访问。子类无法访问基类的私有属性和方法,因为 private 修饰符确保了数据的封装,只有类本身可以操作这些成员。
  3. 受保护(protected):可以在声明它的类内部以及子类中访问,但不能在类的实例外部访问。这为继承体系提供了一定程度的数据保护,允许子类对基类的一些成员进行访问和操作,同时防止外部直接访问。