【发布时间】:2018-08-01 14:30:07
【问题描述】:
我正在玩AST,我想实现一个类Visitor,它遍历我的树并返回一个值。
我尝试过这种方式,但我的代码无法编译:
abstract class ASTVisitor<T> {
public abstract T Visit(SumExpr e);
public abstract T Visit(ProductExpr e);
public abstract T Visit(ConstantExpr e);
public abstract T Visit(SymbolExpr e);
}
class DerivateVisitor : ASTVisitor<ASTExpr> {
public override ASTExpr Visit(SumExpr e){
return new SumExpr(
Visit(e.A),
Visit(e.B));
}
public override ASTExpr Visit(ProductExpr e){
return new SumExpr(
new ProductExpr(Visit(e.A), e.B),
new ProductExpr(Visit(e.B), e.A));
}
public override ASTExpr Visit(ConstantExpr e){
return new ConstantExpr(0);
}
public override ASTExpr Visit(SymbolExpr e) {
return new ConstantExpr(1);
}
}
SumExpr, ProductExpr, ConstantExpr, SymbolExpr 实现:
class ASTExpr{}
class ProductExpr : ASTExpr{
public ASTExpr A, B;
public ProductExpr(ASTExpr a, ASTExpr b) =>
(A, B) = (a, b);
public override string ToString() => $"({A.ToString()}) * ({B.ToString()})";
}
class ConstantExpr : ASTExpr {
public double Value;
public ConstantExpr(double v) => Value = v;
public override string ToString() => Value.ToString();
}
class SymbolExpr : ASTExpr {
public string Name;
private static Dictionary<string, SymbolExpr> Symbols = new Dictionary<string, SymbolExpr>();
private SymbolExpr(string v) {
Name = v;
}
public static SymbolExpr Create(string Name){
if(Symbols.ContainsKey(Name)) return Symbols[Name];
return Symbols[Name] = new SymbolExpr(Name);
}
public override string ToString() => $"Symbol({Name})";
}
class SumExpr : ASTExpr{
public ASTExpr A, B;
public SumExpr(ASTExpr a, ASTExpr b) =>
(A, B) = (a, b);
public override string ToString() => $"({A.ToString()}) + ({B.ToString()})";
}
SumExpr、ProductExpr、ConstantExpr、SymbolExpr 继承自 ASTExpr。
为什么这不起作用?以及如何获得这种行为?
这是编译错误:
exit status 1
main.cs(56,7): error CS1502: The best overloaded method match for `ASTVisitor<ASTExpr>.Visit(SumExpr)' has some invalid arguments
main.cs(45,21): (Location of the symbol related to previous error)
main.cs(56,13): error CS1503: Argument `#1' cannot convert `ASTExpr' expression to type `SumExpr'
main.cs(57,7): error CS1502: The best overloaded method match for `ASTVisitor<ASTExpr>.Visit(SumExpr)' has some invalid arguments
main.cs(45,21): (Location of the symbol related to previous error)
main.cs(57,15): error CS1503: Argument `#1' cannot convert `ASTExpr' expression to type `SumExpr'
main.cs(61,23): error CS1502: The best overloaded method match for `ASTVisitor<ASTExpr>.Visit(SumExpr)' has some invalid arguments
main.cs(45,21): (Location of the symbol related to previous error)
main.cs(61,31): error CS1503: Argument `#1' cannot convert `ASTExpr' expression to type `SumExpr'
main.cs(62,23): error CS1502: The best overloaded method match for `ASTVisitor<ASTExpr>.Visit(SumExpr)' has some invalid arguments
main.cs(45,21): (Location of the symbol related to previous error)
main.cs(62,31): error CS1503: Argument `#1' cannot convert `ASTExpr' expression to type `SumExpr'
Compilation failed: 8 error(s), 0 warnings
提前致谢。
【问题讨论】:
-
你能提供更多细节吗?你遇到了什么样的编译错误
-
我添加了错误
-
当您尝试编译该代码时,请在 Visual Studio 中包含错误列表中的消息。
-
请提供 ASTExpr 和 SumExpr 定义。它们是如何连接的?
-
SumExpr、ProductExpr、ConstantExpr、SymbolExpr 和 ASTExpr 类是否也需要实现?
标签: c# inheritance methods overloading