有没有办法将这两个构造函数合并为一个?基本上他们接受Point3D
类型的相同数组。
public Curve(int degree, params Point3D[] points) {}
public Curve(int degree, IList<Point3D> points) {}
感谢。
答案 0 :(得分:4)
如果你想拥有2个不同的构造函数,你可以:
public Curve(int degree, params Point3D[] points) : this(degree, (IList<Point3D>)points) { }
public Curve(int degree, IList<Point3D> points) { }
或者,如果你只想要一个构造函数让我们说第一个,那么你可以像这样初始化:
new Curve(0,new List<Point3D>().ToArray());
通过让一个构造函数调用另一个构建函数,您不需要复制所有逻辑,并且仍然启用两种格式的初始化。
虽然Array
实现IList<T>
但由于编译错误导致(IList<Point3D)
无法删除compiler ...... cannot call itself
答案 1 :(得分:1)
如果它看起来像这样:
public Curve(int degree, Point3D[] points)
{
...
}
public Curve(int degree, IList<Point3D> points)
{
...
}
比你可以使用:(只要你只需要对其包含的Point3D
s集合进行迭代)
public Curve(int degree, IEnumerable<Point3D> points)
{
...
}
但是,既然你想要一个params
构造函数,那就不可能了,因为你无法像这样调用构造函数:
Curve curve = new Curve(30, p1, p2, p3);
但只有这样:
Curve curve = new Curve(30, new Point3D[] {p1, p2, p3});
您 可以使用以下方式重用其代码:
public Curve(int degree, params Point3D[] points)
{
...
}
public Curve(int degree, IList<Point3D> points) : this(degree, points.ToArray()) { }
或者相反:
public Curve(int degree, IList<Point3D> points)
{
...
}
public Curve(int degree, params Point3D[] points) : this(degree, points as IList<Point3D>) { }
将使用params
构造函数初始化实例,方法与使用List
构造函数的方式相同。
PS: 您可能要考虑将IList
更改为IEnumerable
,以允许该类的用户更抽象地使用它
答案 2 :(得分:0)
如果我理解正确,问题是您不能简单地执行以下操作:
public Curve(int degree, params Point3D[] points)
: this(degree, points) //want to chain to (int, IList<Point3D>) constructor
{
}
public Curve(int degree, IList<Point3D> points)
{
}
因为您收到以下编译时错误:Error CS0516 Constructor 'Curve.Curve(int, params int[])' cannot call itself".
您可以通过简单地将引用转换为适当的类型
来解决这个问题public Curve(int degree, params Point3D[] points)
: this(degree, (IList<Point3D>)points)
{
}
这样可行,因为数组T[]
实现了IList<T>
。