MST

星途 面试题库

面试题:TypeScript类继承链中的访问修饰符与多态性的复杂应用

在TypeScript中,有一个父类`Vehicle`,具有属性`speed`和方法`drive`。创建子类`Car`和`Truck`继承自`Vehicle`。`Car`类新增属性`seats`,`Truck`类新增属性`loadCapacity`。同时,`Car`类重写`drive`方法以考虑乘客舒适度,`Truck`类重写`drive`方法以考虑载重。请使用合适的访问修饰符来确保类继承链的安全性和多态性的正确实现,并解释为什么这样使用访问修饰符。
46.6万 热度难度
前端开发TypeScript

知识考点

AI 面试

面试题答案

一键面试
class Vehicle {
    // 使用protected修饰符,允许子类访问speed属性
    protected speed: number; 

    constructor(speed: number) {
        this.speed = speed;
    }

    // 使用public修饰符,保证子类可以重写该方法,同时外部代码可以调用
    public drive(): void {
        console.log(`Vehicle is driving at speed: ${this.speed}`);
    }
}

class Car extends Vehicle {
    // 使用private修饰符,限制seats属性只能在Car类内部访问
    private seats: number; 

    constructor(speed: number, seats: number) {
        super(speed);
        this.seats = seats;
    }

    // 重写drive方法以考虑乘客舒适度
    public drive(): void {
        console.log(`Car with ${this.seats} seats is driving at speed: ${this.speed} for passenger comfort`);
    }
}

class Truck extends Vehicle {
    // 使用private修饰符,限制loadCapacity属性只能在Truck类内部访问
    private loadCapacity: number; 

    constructor(speed: number, loadCapacity: number) {
        super(speed);
        this.loadCapacity = loadCapacity;
    }

    // 重写drive方法以考虑载重
    public drive(): void {
        console.log(`Truck with load capacity ${this.loadCapacity} is driving at speed: ${this.speed} considering load`);
    }
}

访问修饰符使用原因解释

  1. Vehicle类中的speed属性使用protected
    • 这样做是为了允许子类(CarTruck)访问该属性。如果使用private,子类将无法访问父类的speed属性,这会导致在子类的drive方法中无法使用该属性。如果使用public,则外部代码可以直接修改speed属性,破坏了封装性。
  2. Vehicle类中的drive方法使用public
    • 因为public修饰符允许子类重写该方法,并且外部代码也可以调用。这样既满足了多态性的需求(子类可以根据自身特点重写drive方法),又保证了外部代码可以调用drive方法。
  3. Car类中的seats属性使用private
    • 目的是限制seats属性只能在Car类内部访问,保证了类的封装性。外部代码不需要直接操作seats属性,而是通过类的方法(如drive方法)来间接使用该属性。
  4. Truck类中的loadCapacity属性使用private
    • 同样是为了保证类的封装性,只有Truck类内部的方法可以访问和操作loadCapacity属性,外部代码无法直接修改,提高了代码的安全性和稳定性。
  5. CarTruck类中的drive方法使用public
    • 一方面是为了满足多态性,当通过父类类型的变量调用drive方法时,实际调用的是子类重写后的drive方法。另一方面,也允许外部代码调用子类的drive方法。