CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
IBM Rational 系统开发最佳实践工具包 WebSphere MQ 最佳实践 TOP 15
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  Delphi >  语言基础/算法/系统设计

delphi中可以有私有构造函数吗?

楼主wvins(逸岚)2006-03-09 11:42:17 在 Delphi / 语言基础/算法/系统设计 提问

我的版本是7,似乎有私有构造函数,但看到一段文字大概是陈省的吧,  
  说不能将Create函数私有化  
  http://www.21tx.com/dev/2002/11/05/10112.html  
  单元文件如下:  
  unit   UPrivateConstructor;  
  interface  
  type  
      TConstructor   =   class  
      private  
          public  
      Constructor   Create(I:   Integer);overload;  
  //     public  
      Constructor   Create(S:   string);overload;  
      end;  
  implementation  
  {   TConstructor   }  
  constructor   TConstructor.Create(I:   Integer);  
  begin  
      WriteLn('private   Constructor!');  
  end;  
  constructor   TConstructor.Create(S:   string);  
  begin  
      WriteLn('public   Constructor!');  
  end;  
  end.  
  程序文件如下;  
  program   PPrivateConstructor;  
  {$APPTYPE   CONSOLE}  
  uses  
      SysUtils,  
      UPrivateConstructor   in   'UPrivateConstructor.pas';  
  var  
      x:   TConstructor;  
  begin  
      {   TODO   -oUser   -cConsole   Main   :   Insert   code   here   }  
      x:=   TConstructor.Create('');  
      x:=   TConstructor.Create(4);  
      ReadLn;  
  end.  
   
  问题点数:20、回复次数:14Top

1 楼unsigned(僵哥(发站内消息,请附上链接或问题说明,否则不予回复))回复于 2006-03-09 12:52:14 得分 0

构造函数是供系统调用,而不是供内部调用的怎么可能允许私有?私有的还能算是构造函数?Top

2 楼wvins(逸岚)回复于 2006-03-09 14:36:00 得分 0

真想发火,  
  什么都不懂就不要乱说!  
  成天叽叽歪歪骗积分  
  有空多看看书!  
  操  
  Top

3 楼wvins(逸岚)回复于 2006-03-09 14:41:10 得分 0

对不起大家!  
   
  引起了不好的社会影响。  
  不过真的不吐不快!  
   
  构造函数是供系统调用的?!搞笑吧  
  举个简单的例子  
  type    
      a   =   class  
      end;  
   
  var  
      x:   a;  
   
  x:=   a.create  
  这是什么啊?!系统调用啊!  
   
  Top

4 楼wvins(逸岚)回复于 2006-03-09 14:44:03 得分 0

我还真的就想内部调用。  
   
  就是一个Singleton模式。  
  私有构造函数,然后以一个public的函数提供给用户生成对象!  
   
  如果你连Singleton都不懂的话,那对不起,我没空陪你玩!  
   
   
  Top

5 楼lextm(LeLe)回复于 2006-03-09 15:49:59 得分 8

我不知道Delphi   7应该怎么做,下面是Delphi   10/2006自带的Together自动生成的Singleton模式代码。用得是strict   private关键字。  
  unit   Unit1;  
   
  interface  
   
  uses  
      Windows,   Messages,   SysUtils,   Variants,   Classes,   Graphics,   Controls,   Forms,  
      Dialogs;  
   
  type  
      TForm1   =   class(TForm)  
      private  
   
      {   Private   declarations   }  
      strict   private  
          constructor   Create;  
   
      class   var  
          FInstance:TForm1;  
   
      {   Public   declarations   }  
      public  
          class   function   GetInstance:   TForm1;  
      end;  
   
  var  
      Form1:   TForm1;  
   
  implementation  
   
  {$R   *.dfm}  
  constructor   TForm1.Create;  
  begin  
   
  end;  
   
  class   function   TForm1.GetInstance:   TForm1;  
  begin  
      If   FInstance   =   nil   Then  
      begin  
          FInstance   :=   Unit1.TForm1.Create();  
      end;  
      Result   :=   FInstance;  
  end;  
   
  end.Top

6 楼chijingde(AD)回复于 2006-03-09 16:15:58 得分 12

......lz发火了  
   
  下面是《delphi原子世界》中对构造函数的描述(最近好像总是贴着一段出来....)  
   
  ==================================================================================  
  我们都知道,用下面的语句可以构造一个最简单对象:  
   
  AnObject   :=   TObject.Create;  
   
  编译器将其编译实现为:  
   
  用TObject对应的VMT为依据,调用TObject的Create构造函数。而在Create构造函数调用了系统的ClassCreate过程,系统的ClassCreate过程又通过存储在类VMT调用NewInstance虚方法。调用NewInstance方法的目的是要建立对象的实例空间,因为我们没有重载该方法,所以,它就是TObject类的NewInstance。TObjec类的NewInstance方法将根据编译器在VMT表中初始化的对象实例尺寸(InstanceSize),调用GetMem过程为该对象分配内存,然后调用InitInstance方法将分配的空间初始化。InitInstance方法首先将对象空间的头4个字节初始化为指向对象类对应VMT的指针,然后将其余的空间清零。建立对象实例之后,还调用了一个虚方法AfterConstruction。最后,将对象实例数据的地址指针保存到AnObject变量中,这样,AnObject对象就诞生了。  
   
  =================================================================================  
   
  至于lz贴的文章,我看了下,lz你根本没有看懂作者的意思......  
   
  楼上的代码,是2006的新功能,添加了新的关键字,让Singleton实现起来更简单了Top

7 楼wvins(逸岚)回复于 2006-03-09 16:44:04 得分 0

对不起了  
  公司要求使用delphi,我想把delphi语言特性先搞清楚,不习惯一上来就搞可视化。  
   
  谢谢  
  lextm(LeLe)   (   )    
  你的例子中的class   var是新增加的特性,相当于java/c++中的静态成员变量,使设计模式中的标准实现方法。但7可能不支持,暂时没试过,不确定。  
   
  谢谢  
  chijingde(AD)   (   )  
  不过可能我真的没看懂作者的意思  
  我的问题是关于作者的第二个例子,作者说了一句话  
  “Delphi里面不能实现Create函数的私有化,我们新定义一个函数来代替Create函数,同时屏蔽父类的Create函数。”  
  但当我把构造函数放在private域中时,程序是不能调用的。  
  就像我的例子那样!  
  难道我这么做不是作者说的实现了Create函数的私有化吗?  
   
  Top

8 楼chijingde(AD)回复于 2006-03-09 16:55:24 得分 0

代码的后面还有一句话不知道你看到没有  
   
   
  上面的实现类使用过程中,程序员不用考虑单件模式对象的销毁问题。只是不能调用Create,必须调用Instance函数来获得对象的实例,同时把单件拥有者作为参数传递到函数里。Top

9 楼chijingde(AD)回复于 2006-03-09 16:58:13 得分 0

他实际上是通过Instance调用CreateInstance,  
  而CreateInstance调用Create来创建实例的Top

10 楼wvins(逸岚)回复于 2006-03-09 17:17:34 得分 0

我要说我懂单例模式。他的例子我也了解。  
  “不需要考虑与单件模式的销毁”这句话语我们的讨论无关。  
  我不知道vcl中component类是怎么实现的,  
  但我肯定其实这句话的技巧也不过是一个简单的外覆类——就和c++中的智能指针一样。因为在对象创建的时候,有个owner参数。  
  但语我们的话题无关  
  //==========================================================================  
  我确实没注意到这句话,太关注上面那段话了  
  既然你提到,那就换个问法  
  在这里他为什么不把Create放在private里呢?Top

11 楼chijingde(AD)回复于 2006-03-09 18:11:05 得分 0

。。。因为放不进去....Top

12 楼wvins(逸岚)回复于 2006-03-10 10:16:57 得分 0

我要知道的就是为什么!!  
  因为我  
  type  
      TConstructor   =   class  
      private  
      Constructor   Create(I:   Integer);overload;  
      public  
      Constructor   Create(S:   string);overload;  
      end;  
  难道不算是放进去了吗?Top

13 楼chijingde(AD)回复于 2006-03-10 10:19:27 得分 0

......  
   
  语法规定.....  
  想想就行了  
  你把它设成私有的  
  那别人怎么调用它.....  
   
  Top

14 楼wvins(逸岚)回复于 2006-03-10 13:25:00 得分 0

这么说是不明确的  
  我试过了,程序如上:  
  构造函数是可以私有的,但是不带参数的构造函数是不能放在private域中的。会出现编译错误!  
  [Error]   UPrivateConstructor.pas(9):   Unsatisfied   forward   or   external   declaration:   'TConstructor.Create'  
   
  的确这会覆盖TObject类的构造函数。  
  语法上是不允许的。  
  但是带有参数的构造函是可以放在private域中的。  
  现在总算搞清楚了!!  
  一天后结贴Top

相关问题

  • 如何生成一个构造函数是私有函数的类的对象?
  • 关于delphi的拷贝构造函数
  • 疑惑:拷贝构造和附值函数中私有变量的疑惑????
  • C++类声明了私有构造函数之后的内存错误
  • 构造函数为私有时应该怎样定义类的对象?
  • 构造函数
  • 构造函数
  • 构造函数??
  • 构造函数
  • 函数构造

关键词

  • c++
  • 函数
  • delphi
  • 指针
  • 模式
  • 代码
  • 调用
  • tconstructor
  • 构造
  • 私有

得分解答快速导航

  • 帖主:wvins
  • lextm
  • chijingde

相关链接

  • Delphi类图书
  • Delphi类源码下载
  • Delphi控件下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
Copyright © 2000-2008, CSDN.NET, All Rights Reserved
GongshangLogo