выполнение метода класса, расширяющего абстрактный класс - PullRequest
0 голосов
/ 28 апреля 2020

Я встречал этот пример с сайта Typescript:

abstract class Department {

    constructor(public name: string) {
    }

    printName(): void {
        console.log("Department name: " + this.name);
    }

    abstract printMeeting(): void; // must be implemented in derived classes
}

class AccountingDepartment extends Department {

    constructor() {
        super("Accounting and Auditing"); // constructors in derived classes must call super()
    }

    printMeeting(): void {
        console.log("The Accounting Department meets each Monday at 10am.");
    }

    generateReports(): void {
        console.log("Generating accounting reports...");
    }
}

let department: Department; // ok to create a reference to an abstract type
department = new Department(); // error: cannot create an instance of an abstract class
department = new AccountingDepartment(); // ok to create and assign a non-abstract subclass
department.printName();
department.printMeeting();
**department.generateReports();** // error: method doesn't exist on declared abstract type???

У меня есть 2 вопроса по этому поводу:

  1. почему эта строка недопустима? отдел имеет доступ к generateReports (), поскольку его тип также является отделом учета Я запустил этот код, и он действительно выполняет Department.generateReports () без проблем

  2. , когда я делаю department = new Department();, хотя это является ошибкой для создания экземпляра абстрактного класса не дает мне ошибку во время выполнения. Почему это происходит ? Это моя обязанность не создавать экземпляр абстрактного класса?

1 Ответ

1 голос
/ 28 апреля 2020
  1. department является объявленным как Departement, это означает, что даже если может быть AccountingDepartement, это не гарантирует быть. Подумайте об этом:

    let department: Department;
    // ...
    department = departmentName === 'accounting'
      ? new AccountingDepartment()
      : new CustomerCareDepartment();
    // ...
    department.generateReports(); // You really can't know if it's available
    

    Если бы вы просто набрали let department = new AccountingDepartment();, это было бы нормально, поскольку TS выводит тип и объявляет department как AccountingDepartment

  2. Абстрактные классы являются функцией TypeScript, а не JS, поэтому, когда TS переносится в JS, ключевое слово abstract просто удаляется. Вы получите ошибки во время компиляции, как и большинство функций TypeScript, а не во время компиляции. Посмотрите пример с транспортом здесь: Playground Link

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...