首页 > 解决方案 > 用抽象方法实例化类

问题描述

使用 Java,我们可以创建具有抽象方法的 ActionListener 类的实例,如下所示(已经有一段时间了):

new ActionListener(){
  @Override
  public void actionPerformed(ActionEvent e) {
     // whatever
  }
}

使用 TypeScript,这是我能得到的最接近的:

export abstract class ActionListener {

  constructor(f: any) {
    this.actionPerformed = f;
  }

  abstract actionPerformed(input: string): string;

}


new ActionListener(input => {

});

至少有2个问题:

  1. 如果您在 TS 中使用抽象方法,则该类必须抽象(我认为使用 Java,您可以拥有可以稍后实现的抽象方法)。

  2. 我不知道如何将输入函数 f 的类型与解析方法的类型联系起来。

有谁知道是否有办法用 TS 做到这一点?

也许我们不能abstract与 TS 一起使用,而必须更像这样:

type ActionPerformed = (input: string) => string;

export class ActionListener {

  parse: ActionPerformed;

  constructor(f: ActionPerformed) {
    this.parse = f;
  }

}

new ActionListener(input => {
  return 'foo';
});

标签: typescripttsctypescript3.0

解决方案


使用 Java,我们可以创建具有抽象方法的 ActionListener 类的实例

不,您不能创建具有抽象方法的类的实例。当您调用该抽象方法时应该发生什么?

可以做的是创建实现该抽象方法的抽象类的子类,并且可以创建子类的实例。这正是您的 Java 代码正在做的事情。您的 Java 代码没有实例化ActionListener. 您的 Java 代码正在创建一个覆盖它的子类,并实例化该子类ActionListeneractionPerformed

现在,TypeScript 当然支持子类化,所以你可以在 TypeScript 中做完全相同的事情:创建一个子类,覆盖/实现该方法,然后实例化该子类

new (class extends ActionListener { 
    actionPerformed(input: string): string {
        return "Hello"
    }
})(input => {
    // Whatever
});

或者你可以这样做:

new (class implements ActionListener {
  actionPerformed(input: string): string {
    return "Hello"
  }
});

这里的操场。


推荐阅读