例如假设我定义了一个用于表示复数的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
论证的唯一目的是使签名不同;它在定义和调用构造函数时都是完全未使用的。
对我而言,这似乎是一个丑陋的伎俩:还有更好的选择吗?
答案 0 :(得分:7)
使构造函数成为私有函数并具有静态工厂样式函数。
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);
答案 1 :(得分:3)
创建一个静态方法来创建类,比如Complex::FromDouble
和Complex::FromDoubleAndTheta
。
您可以更进一步,将真正的构造函数设为私有,以强制构造。
例如,请参阅TimeSpan的FromDays和FromHours。
P.S。 使用更好的名字:)
HTH
答案 2 :(得分:0)
我唯一能想到的就是制作一个构造函数(double,double),另一个可能是double,Func。
public Complex(double x, double y) { ... }
public Complex(double r, Func<double> theta) { ... }
从上面的示例看,您正在进行计算,并且该计算的结果是该构造函数的第二个值。如果总是如此,那么你可以改为将其作为Func参数。有点像黑客,但它可能比一个可选的第三个参数更好。