C# 到 Swift 的转换:具有继承的构造函数

C# to Swift Conversion: Constructors with inheritance

我用 C# 做了一个 class 项目,该项目将使用树来求解数学表达式。我有两个 classes :ExpressionTreeExpressionTreeLeaf

我有两个 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)
}