假设我正在定义一个 Complex
类来表示复数。我想定义两个构造函数,这样我就可以这样写:
Complex z1 = new Complex(x: 4, y: 3);
Complex z2 = new Complex(r: 2, theta: Math.PI / 4);
但是,我不能这样定义构造函数:
public Complex(double x, double y) { ... }
public Complex(double r, double theta) { ... }
因为两个构造函数具有相同的签名,这是不允许的。但在 C# 4 中,我可以使用可选参数来编写:
public Complex(double x, double y) { ... }
public Complex(double r, double theta, bool unused=true) { ... }
它有效,然后我可以按预期使用上述构造函数调用。 unused
参数的唯一目的是使签名不同;在定义和调用构造函数时,它完全没有被使用。
对我来说这似乎是一个丑陋的把戏:还有更好的选择吗?
最佳答案
将构造函数设为私有(private)并具有静态工厂样式函数。
public static Complex CreateComplexPolar(double r, double theta);
public static Complex CreateComplex(double x, double y);
您可以根据输入的内容对其进行验证。
另一种可能性是创建一个封装输入的类型并使用您之前提到的构造函数。
public struct PolarCoordinates
{
public double Rho;
public double Theta;
}
public struct CartesianCoordinates
{
public double X;
public double Y;
}
public Complex(PolarCoordinates pc);
public Complex(CartesianCoordinates cc);
关于C#:相同签名的方法/构造函数和命名参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9439234/