访问者模式:基于输入的数字算术

Popa611

假设我们在 C# 中有以下数据层次结构来评估算术中的数学(前缀)表达式int

abstract class Expression {
        public abstract int Evaluate();
}

class ValueExpression : Expression {
    public int Value {
        get;
    }

    public sealed override int Evaluate() {
        return Value;
    }
}

abstract class OperatorExpression : Expression {
    // ...
}

abstract class BinaryExpression : OperatorExpression {
    protected Expression op0, op1;

    public Expression Op0 {
        get { return op0; }
        set { op0 = value; }
    }

    public Expression Op1 {
        get { return op1; }
        set { op1 = value; }
    }

    public sealed override int Evaluate() {
        return Evaluate(op0.Evaluate(), op1.Evaluate());
    }

    protected abstract int Evaluate(int op0Value, int op1Value);
}

sealed class PlusExpression : BinaryExpression {
    protected override int Evaluate(int op0Value, int op1Value) {
        return checked(op0Value + op1Value);
    }
} // and more operators...

我怎么能使用访问者模式来计算表达式,并写出结果intdouble基于用户输入?我想我可能会写一个 Visitor 类来保存double result;,每个Visit(...)都会使用double算术来评估(子)表达式,然后我会将结果转换为int如果需要。但这是使用访问者模式的最佳解决方案吗?如果我想long以后使用怎么办?有必要通过大量代码修改类,或者?(注意:我想使用访问者模式(而不是动态模式)而不是任何通用代码。)

Popa611

取而代之的是int Evaluate()我创建的void Accept(IExpressionVisitor visitor)功能。这个PlusExpression类现在看起来像这样:

sealed class PlusExpression : BinaryExpression
{
    public override void Accept(IExpressionVisitor visitor)
    {
        visitor.Visit(this);
    }
}

然后我创建了两个来自IExpressionVisitor. 例如整数算术的访问者如下所示:

class ExpressionIntVisitor : IExpressionVisitor
{
    Stack<int> stack = new Stack<int>();

    public int GetRetVal()
    {
        return stack.Peek();
    }

    public void Visit(LiteralExpression exp)
    {
        stack.Push(exp.Value);
    }

    public void Visit(PlusExpression exp)
    {
        exp.Op0.Accept(this);
        exp.Op1.Accept(this);
        int b = stack.Pop();
        int a = stack.Pop();

        stack.Push(checked(a + b));
    }

注意:Stack并不是真正必需的,因为它最多包含 2 个值。

对于双重算术,它几乎相同。现在我们打电话Accept(intVisitor)Accept(doubleVisitor)取决于我们需要什么。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

OCaml访问者模式

来自分类Dev

python中的访问者模式

来自分类Dev

PHP中的访问者模式

来自分类Dev

专为访问者模式进行循环?

来自分类Dev

来自基类的访问者模式

来自分类Dev

访问者模式:访问相同结构的不同方式

来自分类Dev

Antlr4 基于事件的访问者 (javascript)

来自分类Dev

访问者设计模式中的方法命名

来自分类Dev

使用访问者模式时如何引用子结果?

来自分类Dev

重载方法分派,没有访问者模式

来自分类Dev

实现C ++访问者模式,避免循环依赖

来自分类Dev

使用多态递归模块创建访问者模式

来自分类Dev

实现调整大小/移动/保存访问者模式

来自分类Dev

C ++访问者模式和多态性

来自分类Dev

仅标题环境中C ++中的访问者模式

来自分类Dev

重载方法分派,无访问者模式

来自分类Dev

使用多态递归模块创建访问者模式

来自分类Dev

在访问者模式中检索类模板的类型

来自分类Dev

不应该重构访问者模式吗?

来自分类Dev

使用访问者模式检查派生类类型?

来自分类Dev

自定义访问者模式实现

来自分类Dev

访问者模式VS迭代器模式:跨层次结构类访问吗?

来自分类Dev

刷新访问者的缓存

来自分类Dev

Woocommerce中基于访问者位置后端错误隐藏价格

来自分类Dev

访问者模式和编译器代码生成,如何处理分配?

来自分类Dev

是否在已知类型的地方跳过“接受”,这是对访问者模式的有效优化?

来自分类Dev

QVariant的访问者模式(无需手动类型测试和转换)

来自分类Dev

如何判断我的网站的访问者是否使用隐身模式?

来自分类Dev

模式访问者:抽象类需要一个功能