Здравствуйте, 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); // и новый функционал добавили
}
}
ведь с такой конструкцией вообще не было бы никаких проблем, если бы она поддерживалась, разве нет?