构造函数的重载是挺明显的一件事,我们经常声明一个类对象时,有时写上一些参数,有时什么参数都不写。如果是VB,只能用optional来实现,并且限制还挺多的。而面对对象中,却可以用重载来灵活实现。
先写一个例子看看:
class m
{
static void Main()
{
point p=new point(12);
Console.WriteLine ("x=" + p.x.ToString());
}
}
class point
{
int m_x = 0;
public int x
{
get { return m_x; }
set { m_x = value; }
}
public point() {}
public point(int x0)
{
m_x = x0;
}
}
这里,我想到之前,我就对C++一个函数有那么多种表达表示奇怪,现在看来,就是重载帮的忙。
把point类放到VS2005中,在定义代码中如愿出现了两个定义让我选择。过瘾!不过好象系统的类底下还可以有一排提示。搜索后得知只要这样写就可以实现该功能了。这样更过瘾。
/// <summary>
/// 直接初使化X坐标
/// </summary>
/// <param name="x">X坐标</param>
/// <returns>构造函数</returns>
public point(int x0)
{
m_x = x0;
}
当有参数时,描述的那句话不会出来,而没有参数时,描述的就出来了。返回值在输入过程中,一直没有出来。不管怎样,这样在F2的“对象浏览器”中都有完整表达。以前看JAVA时,有个文档自动生成方式,代码写好了,文档也就写好了,在C#中,可以找一个项目试试看这种思想对自己有没有效果了。
重载构造函数时,有要求“每个构造函数必须有不同的参数表”,我不知道“public point(int x0)”与“public point(int y0)”是否是不同的参数表,写个代码验证一下:
class m
{
static void Main()
{
point p=new point(12);
Console.WriteLine ("x=" + p.x.ToString());
}
}
class point
{
int m_x = 0;
int m_y = 0;
public int x
{
get { return m_x; }
set { m_x = value; }
}
public int y
{
get { return m_y; }
set { m_y = value; }
}
public point() {}
public point(int x0)
{
m_x = x0;
}
public point(int y0)
{
m_y = y0;
}
}
编译结果:
p.cs(32,9): error CS0111:
类型“point”已定义了一个名为“point”的具有相同参数类型的成员
p.cs(28,9): (与前一个错误相关的符号位置)
编译器认为是同参,因此出错了。后来想一下看,也是为难编译器了,即使是人,也不能分辩出“point p=new point(12);”这句话到底要用哪一个构造函数。
对构造函数,当初还有一个疑问:既然属性都可以直接赋初使值(如private int m_x=12;),为什么还要重构函数,现在想起来,原来我开头看到的都是默认构造函数里面写的代码(如public point() {m_x=0; m_y=0;})才有这种疑问。