[英]C# to Swift Conversion: Constructors with inheritance
我在 C# 中为一个使用树来解决数学表达式的类做了一个项目。 我有两个类: ExpressionTree
和ExpressionTreeLeaf
我有两个ExpressionTree
的构造函数
public ExpressionTree(string d)
{
Data = d;
Left = null;
Right = null;
}
public ExpressionTree(string d, ExpressionTree left, ExpressionTree right)
{
Data = d;
Left = left;
Right = right;
}
我还有一个ExpressionTreeLeaf
构造函数
public ExpressionTreeLeaf(int n) : base(n.ToString())
{
_num = n;
}
我知道:base(n.ToString())
用于调用父构造函数。 我如何在 Swift 中做到这一点?
这可以通过简单地调用super.init
来实现:
class ExpressionTree {
let data: String
let left: ExpressionTree?
let right: ExpressionTree?
init(data: String, left: ExpressionTree? = nil, right: ExpressionTree? = nil) {
self.data = data
self.left = left
self.right = right
}
}
class ExpressionTreeLeaf: ExpressionTree {
init(_ n: Int) {
super.init(data: "\(n)") // <----- here!
}
}
在这种情况下, ExpressionTree
的构造函数不会被ExpressionTreeLeaf
继承,就像在您的 C# 代码中一样。 尽管请注意它们在某些条件下被继承 - 在这种情况下它们只是不满足。
这只是我的观点,但我认为如果您使用具有关联值的递归枚举而不是继承,则表达式树更容易构建(代码少得多)。 Swift 指南中有一个示例。 这是我刚刚想出的另一个例子:
enum BinaryOperator {
case plus, minus, times, divide // and more...
}
enum UnaryOperator {
case plus, minus // and more...
}
indirect enum Expression {
case number(Int)
case binaryOp(Expression, BinaryOperator, Expression)
case unaryOp(UnaryOperator, Expression)
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.