如何处理从基类构造函数调用的派生类中的事件



我认为这更像是一个设计问题,但是这里是。

我有一个使用打字稿的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即可。这有帮助吗?

相关内容

  • 没有找到相关文章

最新更新