递归调用抽象方法

时间:2018-11-02 23:10:49

标签: typescript inheritance recursion abstract-syntax-tree

问题。

我用抽象方法 M 创建了一个抽象类 A 。我在派生类 B 中实现它。但是, M (在 B 中)的实现要求我递归调用它。这样做时,会出现undefined property M错误。我怀疑这与this的绑定有关。无法找出解决办法。

详细信息。

我正在尝试在打字稿的抽象语法树(AST)上执行简单的DFS。我创建了一个抽象类Graph,该类定义了接受文件的方法,并将该文件的AST对象定义为抽象visit方法。我想在AST对象上使用不同类型的遍历重载visit

这是抽象类

import * as fs from 'fs';
import * as ts from 'typescript';

// Base class to parse ASTs
export abstract class Graph {
    private ast_path: string;
    constructor(ast_path:string) { 
        this.ast_path = ast_path;
    }

    abstract visit (node: ts.Node): void;

    public ast2graph() {
        console.log("in ast_parse")

        const source_code = fs.readFileSync(this.ast_path, 'utf-8')
        const source_obj = ts.createSourceFile(this.ast_path, source_code, ts.ScriptTarget.Latest, true);

        this.visit(source_obj);
    }
}

我在类visit中实现了抽象的GraphImpl方法,在这里我递归地尝试遍历所有节点。

import * as fs from 'fs';
import * as ts from 'typescript';
import { Graph } from "./graph";

class GraphImpl extends Graph {
    constructor(ast_path:string) {
        super(ast_path);
    } 

    visit(node: ts.Node): (void) {
        console.log('In visit..');
        // console.log(node);
        console.log(ts.SyntaxKind[node.kind]);
        console.log('--');
        node.forEachChild(this.visit);
    }
}

// Unit-test
const inputFile = process.argv[2];
var graph_obj = new GraphImpl(inputFile);
graph_obj.ast2graph();

这样做时,出现以下错误-

 node.forEachChild(this.visit);
                               ^
TypeError: Cannot read property 'visit' of undefined

当我取消整个类结构并仅实现一个函数visit(),并向其传递一个source_obj时,此方法就可以正常工作。

它似乎与this及其绑定密切相关,同时递归传递它。虽然无法找出解决方法。

我已经阅读并尝试了以下123,但徒劳无功。

建议?

0 个答案:

没有答案