TypeScript不优雅之缺少虚方法

2018/09/21

652

在编程中,我们经常会抽象行为,而让子类有选择性的重写父类的方法,实现面向对象。

Worktile Hulk系统是Worktile公司内部的运营平台,而具体开通业务需要交给Worktile系统完成,通过Api通信。

Worktile Hulk系统中,订单合同有以下类型:

  1. 新购订单 NewBuyService
  2. 增购订单 IncrementService
  3. 续费订单 RenewalService
  4. ……

在新购订单api请求通过后,Hulk系统中应该创建一个客户,但是现阶段的业务,并没有要求在增购api和续费api请求通过后,需要进一步处理。

如果使用C#,在合同父类中应该有这杨一个方法

protected virtual Task OnRequestSuccess(Contract contract)
{
    // nothing need to do
}

之所以使用虚方法,而不用抽象方法,是因为并不是所有类型的订单都需要做后续处理。

但是在TypeScript中,目前没有虚方法概念,所以,为了更优雅,我们不应该使用抽象方法,而是让子类按需重写即可,TypeScript代码如下:

//don't remove, it's a virtual method, newBuyService overridden it
protected async onRequestSuccess(contract: Contract): Promise<void> { }

这样,使用注释,提醒其它开发者,这是一个虚方法,而不是空实现,不可以随便删除的方法。说实话,很捞。

github网友是如何讨论这个问题的?

如果将来要加上这个功能,我更喜欢类似于C#,放入方法签名中。(JAVA中使用装饰器@override)

但是使用装饰器重写需要考虑这些:

期待TypeScript越来越完善吧 :)

评论