Я использую инъекцию зависимостей для всех моих дочерних классов, которые расширяют абстрактный класс.
Проблема, заключающаяся в том, что в классе abstract constructor я запускаю метод, который я планировал переопределить в своих дочерних элементах, если это необходимо.
Я застрял в проблеме, что моя вложенная зависимость не отображается в моем классе переопределения, который запускается из супер.
Вот пример кода:
abstract class Base {
constructor(view: string) {
this._assemble();
}
protected _assemble(): void {
console.log("abstract assembling for all base classes");
}
}
class Example extends Base {
constructor(view: string, private helper: Function) {
super(view);
console.log(this.helper);
}
public tryMe(): void {
this._assemble();
}
protected _assemble(): void {
super._assemble();
// at first run this.helper will be undefined!
console.log("example assembling", this.helper);
}
}
let e = new Example("hoho", function () { return; })
console.log("So now i will try to reassemble...");
e.tryMe();
Итак, ядро проблемы состоит в том, что typescript преобразует класс Example в код следующим образом:
function Example(view, helper) {
_super.call(this, view);
this.helper = helper;
console.log(this.helper);
}
Вместо этого:
function Example(view, helper) {
this.helper = helper;
_super.call(this, view);
console.log(this.helper);
}
Как вы видите, если я помещаю this.helper
до _super
в JavaScript, this.helper
будет всегда отображаться в _assemble
. Даже если super
вызовет функцию _assemble
.
Но по умолчанию это назначается после вызова _super
. Поэтому, если класс super
вызовет сборку. Он не будет отображаться при переопределении метода _assemble
в примере в первый раз.
Итак, мой вопрос...
Это ошибка?
или
Что я не знаю?
Теперь я исправил свою проблему, просто удалив _assemble
из класса super
и всегда вызываю ее из дочернего. Но это просто неправильно.
Nota Bene: Вот скомпилированный код JavaScript и демонстрационный код JavaScript:
TypeScript обычный вывод:
var __extends = (this && this.__extends) || function (d, b) {
for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
function __() { this.constructor = d; }
d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
};
var Base = (function () {
function Base(view) {
this._assemble();
}
Base.prototype._assemble = function () {
document.write("<p>abstract assembling for all base classes</p>");
};
return Base;
}());
var Example = (function (_super) {
__extends(Example, _super);
function Example(view, helper) {
_super.call(this, view);
this.helper = helper;
console.log(this.helper);
}
Example.prototype.tryMe = function () {
this._assemble();
};
Example.prototype._assemble = function () {
_super.prototype._assemble.call(this);
// at first run this.helper will be undefined!
document.write("<p>example assembling <b/>" + (this.helper) + "</b></p>");
};
return Example;
}(Base));
var e = new Example("test", function () { return "needle"; });
document.write("<p><i>So now i will try to reassemble...</i></p>");
e.tryMe();