Re[2]: Присвоение свойств и вызов виртуального метода из конструктора
От: sharez  
Дата: 15.11.16 09:23
Оценка:
Здравствуйте, Sharov, Вы писали:

S>Здравствуйте, sharez, Вы писали:


S>Здесь можно почитать со всеми ссылками и т.д.


> When you combine these two facts you are left with the problem that if you make a virtual method call in a constructor, and it is not the most derived type in its inheritance hierarchy, that it will be called on a class whose constructor has not been run, and therefore may not be in a suitable state to have that method called.


Как раз это и есть проблема, что наследник имеет возможность переопределить поведение объекта, но не имеет возможности это поведение настроить (указать переменные/поля/аргументы) до его вызова.
Иными словами в конструкторе есть табу на вызов виртуальных методов, т. к. у нас нет возможности передать им какие-то дополнительные данные, необходимые для наследников (хотя бы через поля).
Я никак не могу взять в толк, зачем вообще компиляторы реализованы так, что не имеют возможности обработать следующую конструкцию:

class Child extends Parent {

    protected data: SomeObject;

    constructor(data: SomeObject) { 
        this.data = data; // укажем новую настройку объекта
        super(); // и вызовем конструирование
    }

    // вызовется во время выполения конструктора Parent
    public init() {
        super.init(data.x); // и старую реализацию скорректировали
        useAnotherFeature(data.y); // и новый функционал добавили
    }

}


ведь с такой конструкцией вообще не было бы никаких проблем, если бы она поддерживалась, разве нет?
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.