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




