DotNet中的构造函数大聚会,并在此各显神通

(1)公共构造函数
        共公的构造函数是最为常见的形式,允许类被使用者实例化。
C#实例如下:
1 None.gif class  myClass
2 ExpandedBlockStart.gifContractedBlock.gif dot.gif {
3InBlock.gif    //Public Constructor
4ExpandedSubBlockStart.gifContractedSubBlock.gif    public myClass()dot.gif{};
5ExpandedBlockEnd.gif}

VB实例如下:
ExpandedBlockStart.gif ContractedBlock.gif Class myClass Class myClass
InBlock.gif{
ExpandedSubBlockStart.gifContractedSubBlock.gif    
public Sub new()sub new()
ExpandedSubBlockEnd.gif    
end sub

InBlock.gif}


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

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

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

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

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

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

None.gif Using System;
None.gifNamespace Staticconstructor
ExpandedBlockStart.gifContractedBlock.gif
dot.gif {
InBlock.gif    
public class myNewClass
ExpandedSubBlockStart.gifContractedSubBlock.gif    
dot.gif{
InBlock.gif        
protected myNewClass()
ExpandedSubBlockStart.gifContractedSubBlock.gif        
dot.gif{
ExpandedSubBlockEnd.gif        }

ExpandedSubBlockEnd.gif    }

ExpandedBlockEnd.gif}

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

None.gif Using System;
None.gifNamespace Staticconstructor
ExpandedBlockStart.gifContractedBlock.gif
dot.gif {
InBlock.gif    
public class myFactory
ExpandedSubBlockStart.gifContractedSubBlock.gif    
dot.gif{
InBlock.gif        
public myFactory ()
ExpandedSubBlockStart.gifContractedSubBlock.gif        
dot.gif{
ExpandedSubBlockEnd.gif        }

InBlock.gif        
public myNewClass CreatemyNewClass()
ExpandedSubBlockStart.gifContractedSubBlock.gif        
dot.gif{
InBlock.gif            
return  new  myNewClass();
ExpandedSubBlockEnd.gif        }

ExpandedSubBlockEnd.gif    }

ExpandedBlockEnd.gif}

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

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

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

None.gif Using System;
None.gifNamespace Staticconstructor
ExpandedBlockStart.gifContractedBlock.gif
dot.gif {
InBlock.gif    
public class myFactory
ExpandedSubBlockStart.gifContractedSubBlock.gif    
dot.gif{
InBlock.gif        
public myFactory ()
ExpandedSubBlockStart.gifContractedSubBlock.gif        
dot.gif{
ExpandedSubBlockEnd.gif        }

InBlock.gif        
public myNewClass CreatemyNewClass()
ExpandedSubBlockStart.gifContractedSubBlock.gif        
dot.gif{
InBlock.gif            
return  new  mySubClass ();
ExpandedSubBlockEnd.gif        }

InBlock.gif        
private class mySubClass : myNewClass
ExpandedSubBlockStart.gifContractedSubBlock.gif        
dot.gif{
InBlock.gif            
public mySubClass():base()
ExpandedSubBlockEnd.gif        }

ExpandedSubBlockEnd.gif    }

ExpandedBlockEnd.gif}

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

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

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

ExpandedSubBlockEnd.gif    }

ExpandedBlockEnd.gif}

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

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

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

InBlock.gif
InBlock.gif        
static myClass()
ExpandedSubBlockStart.gifContractedSubBlock.gif        
dot.gif{
InBlock.gif            System.Console.WriteLine(
"This is static constructor");
ExpandedSubBlockEnd.gif        }

InBlock.gif
InBlock.gif        
public static void Hello()
ExpandedSubBlockStart.gifContractedSubBlock.gif        
dot.gif{
InBlock.gif            System.Console.WriteLine(
"Hello");
ExpandedSubBlockEnd.gif        }

InBlock.gif
InBlock.gif        
public static void Main()
ExpandedSubBlockStart.gifContractedSubBlock.gif        
dot.gif{
InBlock.gif            myClass.Hello();
InBlock.gif            myClass ms 
= new myClass();
InBlock.gif            System.Console.WriteLine();
ExpandedSubBlockEnd.gif        }

ExpandedSubBlockEnd.gif    }

ExpandedBlockEnd.gif}

None.gif


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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值