繁体   English   中英

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

[英]C# to Swift Conversion: Constructors with inheritance

我在 C# 中为一个使用树来解决数学表达式的类做了一个项目。 我有两个类: 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# 代码中一样。 尽管请注意它们在某些条件继承 - 在这种情况下它们只是不满足。


这只是我的观点,但我认为如果您使用具有关联值的递归枚举而不是继承,则表达式树更容易构建(代码少得多)。 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM