我认为这更像是一个设计问题,但是这里是。
我有一个使用打字稿的Web应用程序。我有一个从基类继承的类。基类在其构造函数中调用一些初始化代码(例如下载.xml文件)。下载完成后,它会调用事件(例如init_completed)。
现在,我需要派生的类来处理此事件。我知道我可以在派生类中的基类中注册该事件,并在派生类中重载该处理程序。
但是,我需要派生的类能够注册此事件处理程序,例如:
this.OnLoaded += this.LoadedCompleted;
这是问题:
如何正确设计它?...因为加载是在 基类构造函数。这意味着已加载的事件可能是 在派生类之前被调用机会注册/收听 这个事件。
您可以在调用基类构造器之前初始化子类中的成员:
class A{
constructor(){
// register here
}
}
class B extends A{
b;
constructor(){
this.b = 123; // Setup members here
super();
}
}
如何正确设计?在派生类具有更改以注册/收听此事件之前,可以调用已加载的事件。
我建议将承诺用于此类事件,这些事件只会发射一次,例如您的文件的load
事件。承诺确实可以很好地处理
- 他们支持多个独立处理者
- 注册时间无关紧要 - 每个处理程序可在可用值时尽快执行。
您可以从许多实现中进行选择,并且可以免费处理错误处理和链接/组成。
我不确定我是否正确理解您的问题。在我看来,您似乎不需要一个活动:
考虑:
class Base {
constructor() {
init(this.afterInit.bind(this));
}
init(callback: Function): void {
//Do something asynchronous
}
afterInit() {
//Do something after initialization
}
}
class Derived extends Base {
constructor() {
super();
}
afterInit() {
super.afterInit();
//Do something else after initialization
}
}
,但如果必须使用事件:
class MyEvent {
register(handler: (sender: any) => void) {
//Put the handler in a collection
}
raise() {
//Invoke all the handlers
}
}
class Base {
onAfterInit = new MyEvent();
constructor() {
init();
}
init(): void {
//Do something asynchronous
//Then invoke the event
this.onAfterInit.raise();
}
}
class Derived extends Base {
constructor() {
super();
}
init() {
this.onAfterInit.register(sender => {
//Do something after initialization
})
super.init();
}
}
注册处理程序后,只需致电super.init即可。这有帮助吗?