C# 到 Swift 的转换:具有继承的构造函数
C# to Swift Conversion: Constructors with inheritance
我用 C# 做了一个 class 项目,该项目将使用树来求解数学表达式。我有两个 classes :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# 代码中一样。尽管请注意 conditions 被 继承 - 在这种情况下他们只是不满意。
这只是我的意见,但我认为如果使用具有关联值的递归枚举而不是继承,表达式树更容易构建(代码更少)。 Swift 指南中有一个 example。这是我刚刚想出的另一个例子:
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)
}
我用 C# 做了一个 class 项目,该项目将使用树来求解数学表达式。我有两个 classes :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# 代码中一样。尽管请注意 conditions 被 继承 - 在这种情况下他们只是不满意。
这只是我的意见,但我认为如果使用具有关联值的递归枚举而不是继承,表达式树更容易构建(代码更少)。 Swift 指南中有一个 example。这是我刚刚想出的另一个例子:
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)
}