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