Почему нельзя вызывать абстрактные защищенные методы из дочерних классов? - PullRequest
3 голосов
/ 25 апреля 2020

Вот упрощенная версия того, что я хотел в проекте:

abstract class Parent {
    protected abstract method(): any;
}

class Child extends Parent {
    protected method(): any {}

    protected other() {
        let a: Parent = new Child()
        a.method()
    }
}

class Other extends Parent {
    protected method(): any {}
}

Сбой при попытке вызвать a.method(). Ошибка выглядит следующим образом:

Property 'method' is protected and only accessible through an instance of class 'Child'.

Playground Link

Насколько я понимаю, проблема заключается в том, что a.method() не вызывается изнутри фактический экземпляр a. Но, тем не менее, он вызывается из экземпляра Child, поэтому ошибка кажется странной. Разве экземпляры одного и того же базового класса не «дружат» друг с другом?

И, наконец, как я могу решить свою проблему, не теряя преимуществ, которые дает protected? Благодаря.

Ответы [ 2 ]

2 голосов
/ 25 апреля 2020

В соответствии со спецификациями TypeScript, если переменная базового класса защищена, мы не можем использовать ее непосредственно из производного класса для объекта non-this. Таким образом, вы можете позвонить this.method(), но не a.method().

Второй последний абзац страницы 120 TS spe c: https://github.com/microsoft/TypeScript/blob/master/doc/TypeScript%20Language%20Specification.pdf

0 голосов
/ 25 апреля 2020

Мне кажется, вы ошибаетесь. Всякий раз, когда вы делаете let a: Parent = new Child();, вы вне класса, и именно поэтому TS-компилятор предупреждает вас. Вы можете позвонить this.method() без проблем, потому что на этот раз вызывающим абонентом является Parent экземпляр.

abstract class Parent {
    protected abstract method(): any;
}

class Child extends Parent {
    protected method(): any {}

    protected other() {
        this.method(); // here
    }
}

class Other extends Parent {
    protected method(): any {}
}

Playground Link

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