就他吧-9ta8为您提供:身份证查询、15位转16位身份证,手机号码归属地查询,IP地址查询服务,城市天气预报查询,列车时刻表简易快速查询等等查询服务,就他吧欢迎您的光临!!
随笔-93  评论-627  文章-7  trackbacks-76
(1)公共构造函数
        共公的构造函数是最为常见的形式,允许类被使用者实例化。
C#实例如下:
1class myClass
2{
3    //Public Constructor
4    public myClass(){};
5}

VB实例如下:
Class myClass
{
    
public sub new()
    
end sub

}


(2)私有构造函数
        私有构造函数是一种特殊的实例构造函数,通常应用于只包含静态成员的类中,这些类经常作为实用类使用。

        如果类具有一个或多个私有构造函数而没有公共构造函数,则不允许被其他类(嵌套类除外)创建该类的实例。例如:
class myClass
{
    
private myClass(){};
    
public static double e = 2.71828;
}

        声明空构造函数可阻止自动生成默认构造函数。注意,如果不对构造函数使用访问修饰符,则在默认情况下它仍是私有构造函数。但是,通常显示地使用private(私有)修饰符来清楚地表明该类不能被实例化。

        当没有实例字段或实例方法或调用方法以获得类的实例时,私有构造函数可用于阻止创建类的实例。

        私有函数的另一个应用场合是在单件(Singleton)模式中,是该模式实现的关键。私有函数保证类的实例只能通过该类中的静态方法实现,从而保证实例的唯一性。
        有关单件模式的介绍,请参见:http://fineboy.cnblogs.com/archive/2005/08/11/212782.html

(3)保护构造函数
        受保护的构造函数使类可以被子类实例化,在大多数场合无用。但如果希望类只能被工厂实例化时,就用到了这个特性。下面是类只能被工厂实例化的例子:
        首先,我们使类的构造函数被声明为受保护的构造函数,即除了类和子类,都不能访问构造函数。

Using System;
Namespace Staticconstructor
{
    
public class myNewClass
    
{
        
protected myNewClass()
        
{
        }

    }

}

        这样就保证了不能直接实例化myNewClass,然后我们创建一个工厂,负责实例化这个类。

Using System;
Namespace Staticconstructor
{
    
public class myFactory
    
{
        
public myFactory ()
        
{
        }

        
public myNewClass CreatemyNewClass()
        
{
            
return  new  myNewClass();
        }

    }

}

        然而代码无法通过编译,因为myNewClass的构造函数是受保护的,无法被myFactory实例化。结果是其他类无法实例化myNewClass,myFactory也不能。

        由于myNewClass的构造函数是受保护的,因此其子类可以实例化这个类。但我们不能将工厂类作为其子类,这样会导致耦合性。同时我们也不希望让类本身实例化自身,因为需要静态方法。

        为了解决这个矛盾,要用到内部类。我们在myFactory内部创建一个私有的myNewClass的子类,然后通过该子类获得myNewClass的实例。

Using System;
Namespace Staticconstructor
{
    
public class myFactory
    
{
        
public myFactory ()
        
{
        }

        
public myNewClass CreatemyNewClass()
        
{
            
return  new  mySubClass ();
        }

        
private class mySubClass : myNewClass
        
{
            
public mySubClass():base()
        }

    }

}

        当然,myFactory实际返回的mySubClass,而不是myNewClass,不过对客户而言并无区别。

        这种方法也有缺陷,如果定义一个myNewClass的子类,即可通过该子类实现其实例化,但这种方法在实际中已经够用。

(4)静态构造函数        
        静态构造函数用于初始化类,在创建第一个实例或引用任何静态成员之前,将自动调用静态构造函数来初始化类。静态构造函数的声明方式如下:
Using System;
Namespace Staticconstructor
{
    
public class myNewClass
    
{
        
static myNewClass()
        
{
        }

    }

}

        静态构造函数既没有修饰符,也没有参数。它在创建第一个实例或引用任何静态成员之前将被自动初始化类,无法直接调用静态构造函数。

        在程序中,用户无法控制何时执行静态构造函数。

        静态构造函数的典型用途是当类使用日志文件时,将使用这种构造函数向日志文件中写入项。下面是静态构造函数的使用示例:
using System;
namespace StaticConstructor
{
    
public class myClass
    
{
        
public myClass()
        
{
            System.Console.WriteLine(
"New Instance Created");
        }


        
static myClass()
        
{
            System.Console.WriteLine(
"This is static constructor");
        }


        
public static void Hello()
        
{
            System.Console.WriteLine(
"Hello");
        }


        
public static void Main()
        
{
            myClass.Hello();
            myClass ms 
= new myClass();
            System.Console.WriteLine();
        }

    }

}


希望大家对构造函数进行补充。

posted on 2005-08-13 15:11 振河 阅读(1797) 评论(11)  编辑 收藏 所属分类: C#

评论:
#1楼  2005-08-13 15:27 | 蛙蛙池塘      
有意思
  回复  引用  查看    
#2楼  2005-08-13 16:13 | zitiger      
呵呵,不错不错.
  回复  引用  查看    
#3楼  2005-08-13 16:36 | Ninputer      
受保护的构造方法,就是专门提供给子类构造函数调用的。子类除了在自己的构造函数里调用父类的保护构造函数外,不能在其它地方调用,也不能用new运算符调用父类的保护构造函数(即用这个构造函数实例化)。不过在C#1.0里面有Bug所以你可以这样做……
  回复  引用  查看    
#4楼  2005-08-14 10:50 | James [未注册用户]
记得刚学习c#的时候 那本坚果的书上就讲了这些。
  回复  引用    
#5楼  2005-08-15 09:25 | 振河      
@Ninputer
你在C#1.1中测试过吗?C#1.0中有Bug,C#1.1中也有同样的Bug吗?
定义下面的受保护的构造函数
public class protectedClass
{
protected protectedClass()
{}

public string getStr()
{
return "jianglijun";
}
}

在下面的类中,通过定义的私有类来调用上面的类中的方法,可以正常运行
public class testProtected
{
public testProtected()
{}

public string test()
{
protectedClass s = new testclass();
return s.getStr();
}

private class testclass : protectedClass
{
public testclass():base()
{
}
}
}
是不是C#1.1中也存在着同样的Bug?
  回复  引用  查看    
#6楼  2005-08-15 09:57 | R2      
abstract sealed class
  回复  引用  查看    
#7楼  2005-08-15 11:08 | alittlefish      
别怪我咬文嚼字,少说了个反序列化构造函数。
  回复  引用  查看    
#8楼  2005-08-15 12:41 | 振河      
@alittlefish
非常感谢你的补充,能不能具体的讲一下呢

  回复  引用  查看    
#9楼 [楼主] 2005-08-15 13:30 | 振河      
关于序列化和反序列化,看看微软是怎么介绍“.NET 中的对象序列化”的。
  回复  引用  查看    
#10楼  2005-08-21 12:11 | flyarror [未注册用户]
讲的有点意思,呵呵
  回复  引用    
#11楼  2005-10-06 20:21 | grwdpy [未注册用户]
如果一个类的构造方法定义为private类型,其子类的无参数构造函数就会提示出错!
如:
public class Third
{
private Third()
{
//
// TODO: 在此处添加构造函数逻辑
//
}
}
然后定义其子类
public class Fourthly:Third
{
private Fourthly()
{

}
}
上面类Fourthly就会出错!
  回复  引用    

标题  
姓名  
主页
Email (只有博主才能看到) 
验证码 *  看不清,换一张 [登录][注册]
内容(请不要发表任何与政治相关的内容)  
  登录  使用高级评论  新用户注册  返回页首  恢复上次提交      
该文被作者在 2005-08-13 15:23 编辑过


相关链接:
 





  就他吧-9ta8伴您开心每一天