zoukankan      html  css  js  c++  java
  • TypeScript Visitor设计模式

    以下翻译脑袋的VBF项目,试试看TypeScript能否重写。

    class RegExpr {     Accept<T>(convert: Converter<T>) {     } } class SymbolExpr extends RegExpr {     Symbol: string     constructor(symbol: string) {         this.Symbol = symbol;         super();     }     Accept<T>(convert: Converter<T>) {         return convert.AcceptSymbolExpr(this);     } } class KleeneStarExpr extends RegExpr {     InnerExpression: RegExpr     Accept<T>(convert: Converter<T>) {         return convert.AcceptKleeneStarExpr(this);     } } class AlternationExpr extends RegExpr {     Expr1: RegExpr     Expr2: RegExpr     Accept<T>(convert: Converter<T>) {         return convert.AcceptAlternationExpr(this);     } } class ConcatenationExpr extends RegExpr {     Left: RegExpr     Right: RegExpr     Accept<T>(convert: Converter<T>) {         return convert.AcceptConcatenationExpr(this);     } } class EmptyExpr extends RegExpr {     Accept<T>(convert: Converter<T>) {         return convert.AcceptEmpty(this);     } } interface Converter<T> {     AcceptEmpty(expr: RegExpr): T;     AcceptSymbolExpr(expr: SymbolExpr): T;     AcceptKleeneStarExpr(expr: KleeneStarExpr): T;     AcceptAlternationExpr(expr: AlternationExpr): T;     AcceptConcatenationExpr(expr: ConcatenationExpr): T; } class RegularExprPrettyPrint implements Converter<String> {     AcceptEmpty(expr: EmptyExpr) {         return "ε";     }     AcceptSymbolExpr(expr: SymbolExpr) {         return expr.Symbol;     }     AcceptKleeneStarExpr(expr: KleeneStarExpr) {         return "(" + expr.InnerExpression.Accept(this) + ")*";     }     AcceptAlternationExpr(expr: AlternationExpr) {         return "(" + expr.Expr1.Accept(this) + "|" + expr.Expr2.Accept(this) + ")";     }     AcceptConcatenationExpr(expr: ConcatenationExpr) {         return "(" + expr.Left.Accept(this) + expr.Right.Accept(this) + ")";     } } window.onload = () => {     var s = new SymbolExpr("A");     var kstart = new KleeneStarExpr();     kstart.InnerExpression = s;     var formatter = new RegularExprPrettyPrint();     var str = kstart.Accept(formatter)     alert(str); };
  • 相关阅读:
    Spring 中的邮件任务
    Spring 定时任务
    java中同步交互 与 异步交互
    Springboot 版本包冲突
    Derby 配置环境变量
    Springboot中的Web服务Tomcat改为Jetty
    二叉树中和为某一值的路径
    0-Java中this和super的用法总结
    树9:二叉搜索树的后序遍历
    位运算-输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。
  • 原文地址:https://www.cnblogs.com/jiangzhen/p/4467851.html
Copyright © 2011-2022 走看看