在super()调用中访问它

jds*_*816 2 typescript

class MySystem extends ListIteratingSystem {
    constructor (private creator: EntityCreator) {
        super(MyNode, this.updateNode);
    }

    updateNode() {/* sniiiiip */}

    /* sniiiip */
}
Run Code Online (Sandbox Code Playgroud)

在上面的代码中,我需要一些方法将updateNode函数传递给超级调用.编译器抱怨这说明:

Keyword 'this' cannot be referenced in initializers in a class body, or in super constructor calls

关于如何解决这个问题的任何想法?这里的用例是我抽取了很多与列表遍历相关的锅炉板代码,并将其抽象到这个基类中,该基类由几个完成实际工作的特定系统扩展.基类需要调用更新,添加和删除的方法......

Rya*_*ugh 5

我不是100%清楚你的用例的语义,但你有一些选择取决于目标.

首先是将updateNode/ addNode/ 定义removeNode为基类的成员,让派生类覆盖它们(而不是将它们指定为构造函数参数).这对于你的派生实现来说有点不太清楚,因为TypeScript没有'abstract'的概念,但可能是最干净和最简单的.

第二个是重构一下,让派生类提供一个类型参数而不是一个方法列表,并将update/add/remove函数放在"姐妹"类中,这些类以一种允许基类给出的方式提供该功能他们需要你得到的背景this.这是更多的工作,但更好地分离关注点.如果你试图完成控制模式的反转,那么最好通过组合而不是继承来完成.

最后一个选项是颠倒整个类层次结构并将遍历/ etc代码移动到这些单独实现将使用的单独类中,实质上是对现有代码中的任何控制反转进行反转.

我应该补充一点,你没有this在基类构造函数参数位置引用的限制通常是一个非常好的限制 - 试图违反它通常意味着你正在为自己的失败做好准备.在这种情况下,如果限制没有到位,当您尝试继承时MySystem,或者在构建期间ListIteratingSystem确定应该调用时,您可能会遇到大麻烦updateNode.出于同样的原因,C#中的FxCop强制执行此限制.