虚方法、重写方法和抽象方法
//虚方法、重写方法和抽象方法
public abstract class Expression //表达式
{
public abstract double Evaluate(Dictionary<string,object> vars); //抽象方法,要重写
}
public class Contant : Expression //常量
{
double _value; //全局变量
public Contant(double value) //构造函数
{
_value = value;
}
public override double Evaluate(Dictionary<string,object>vars) //重写抽象方法
{
return _value;
}
}
public class VariableReference : Expression //变量
{
string _name;
public VariableReference(string name) //构造函数
{
_name = name;
}
public override double Evaluate(Dictionary<string,object> vars) //重写抽象方法
{
object value = vars[_name] ?? throw new Exception($"Unknown variable : {_name}");
return Convert.ToDouble(value);
}
}
public class Operation : Expression //进行运算
{
Expression _left; //表达式左边
char _op; //操作符
Expression _right; //表达式右边
public Operation(Expression left,char op,Expression right) //构造函数
{
_left = left;
_op = op;
_right = right;
}
public override double Evaluate(Dictionary<string,object> vars) //重写抽象方法
{
double x = _left.Evaluate(vars);
double y = _right.Evaluate(vars);
switch(_op)
{
case '+': return x + y;
case '-': return x - y;
case '*': return x * y;
case '/': return x / y;
default: throw new Exception("Unknown opertator");
}
}
}
Expression e = new Operation(
new VariableReference("X"),
'+',
new Constant(3));
//计算 x*(y + 2)
Expression e = new Operation(
new VariableReference("x"),
'*',
new Operation(
new VariableReference("y"),
'+',
new Constant(2)
)
);
Dictionary<string,object>vars = new();
vars["x"] = 3;
vars["y"] = 5;
Console.WriteLine(e.Evaluate(vars));
vars["x"] = 1.5;
vars["y"] = 9;
Console.WriteLine(e.Evaluate(vars));