yzx99

导航

 

构造函数的重载是挺明显的一件事,我们经常声明一个类对象时,有时写上一些参数,有时什么参数都不写。如果是VB,只能用optional来实现,并且限制还挺多的。而面对对象中,却可以用重载来灵活实现。
先写一个例子看看:

using System;

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)”是否是不同的参数表,写个代码验证一下:

using System;

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;})才有这种疑问。

posted on 2008-05-25 18:31  yzx99  阅读(1888)  评论(0编辑  收藏  举报