继承抽象类并在构造函数中进行配置

问题描述 投票:0回答:1

我来自 PHP 世界,目前正在实现我的第一个 TypeScript 项目。不幸的是,很多我在 PHP 中已经习惯了很长时间的东西在这里不起作用。其中之一是以下代码示例:

abstract class Car {

    constructor() {
        this.initCar()
    }

    abstract initCar(): void

    abstract start(): void
}

class SportCar extends Car {

    private engine = ''
    
    initCar(): void {
        this.engine = 'V8'
    }

    start() {
        console.log(`I'm starting the ${this.engine} engine.`)
    }
}

const sportCar = new SportCar()
sportCar.start()

我的期望是我正在启动V8引擎。将会输出。但不幸的是我正在启动引擎。将会输出。

  1. TypeScript + JavaScript 对这个示例做了什么?
  2. 如何解决我想使用抽象类的构造函数来配置子对象的情况。
node.js typescript abstract
1个回答
0
投票

这可以通过查看 Javascript 输出来回答:

"use strict";
class Car {
    constructor() {
        this.initCar();
    }
}
class SportCar extends Car {
    constructor() {
        super(...arguments);
        this.engine = '';
    }
    initCar() {
        console.log('initCar');
        this.engine = 'V8';
    }
    start() {
        console.log(`I'm starting the ${this.engine} engine.`);
    }
}
const sportCar = new SportCar();
sportCar.start();

如您所见,

this.engine = ''
行在构造函数之后执行。

我认为这也是相当令人惊讶的行为。解决这种情况的最简单方法是不将

engine
初始化为空字符串,因为毕竟......为什么会呢?你总是会覆盖它。

class SportCar extends Car {

    private engine!: string;
    
    initCar(): void {
        console.log('initCar');
        this.engine = 'V8';
    }

    start() {
        console.log(`I'm starting the ${this.engine} engine.`)
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.