如何能防止一个类的构造函数被外界直接访问?

Hyphoon 2003-02-12 03:23:21
在单件(Singleton)模式中,要求构造器是被保护的, 那在Delphi如何实现?就算把子类的构造器保护起来,构造器都可以直接访问, 只不过访问的是父类中没保护起来的构造器?
...全文
104 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
Hyphoon 2003-02-17
  • 打赏
  • 举报
回复
终于在《Delphi技术手册》中找到了问题的答案, 在Delphi Pascal中的确没有办法把所有(包括父类)的构造器屏蔽掉, 只能变相在构造器中产生一个异常来达到相同的目的。代码的大体结构如下:

TCanNotCreat = class
private
constructor Create(AOwner : TObject); overload;
public
constructor Create; reintroduce; overload;
//覆盖掉TObject中的Create, 产生一个异常来让使用者“明白”原因
end;


constructor TA.Create;
begin
raise Exception.Create('Can not Create it direct.');
end;
idilent 2003-02-13
  • 打赏
  • 举报
回复
这个类能够实例化吗?还不如用接口。
Eastunfail 2003-02-13
  • 打赏
  • 举报
回复
不太明白搂主的意思。
墨梅无痕 2003-02-13
  • 打赏
  • 举报
回复
要求构造器被保护,外界不能访问!
要创建类的实例,外界必须使用构造器!
————悖论乎?
wuwoczj 2003-02-13
  • 打赏
  • 举报
回复
外界无法访问构造函数,怎么创建?
什么意思?
要达到什么目的呢?
不明白

Hyphoon 2003-02-13
  • 打赏
  • 举报
回复
谢谢 largewang(老王), 同时感谢各位。
szjay 2003-02-13
  • 打赏
  • 举报
回复
构造函数是类方法,它不依赖对象的存在而存在。
除非是你自己overload的构造函数,否则应该都是可以访问的。
largewang 2003-02-13
  • 打赏
  • 举报
回复
看这里:http://www.csdn.net/develop/read_article.asp?id=15077
wjlsmail 2003-02-12
  • 打赏
  • 举报
回复
重写一些构造应该能达到目的,但如你所说的"防止所有的构造器被访问(包括所有的父类的)。" 未必能实现


Study
Hyphoon 2003-02-12
  • 打赏
  • 举报
回复
To wjlsmail(计算机质子) :

你这种写法是可以防止调用子类定义的constructor Create(UStr, PStr : String); 但无法防止访问TThread及其父类中非私有的构造器, 例如TObjecy中的constructor Create,虽然返回并非该子类的实例,但也存在危险的可能, 我的意思是能否有办法防止所有的构造器被访问(包括所有的父类的)。
wjlsmail 2003-02-12
  • 打赏
  • 举报
回复
type
TThreadOfPick = class(TThread)
private
{ Private declarations }
TheUser: String;
ThePwd: String;

protected
procedure Execute; override;
public
constructor Create(UStr, PStr : String); // 重写一下
end;


with TThreadOfPick.Create(NameStr,PwdStr) do
//这时可以 Create ;

begin
if Suspended then Resume;
end;


------------------------------------------------

type
TThreadOfPick = class(TThread)
private
{ Private declarations }
TheUser: String;
ThePwd: String;
constructor Create(UStr, PStr : String);

protected
procedure Execute; override;
end;


with TThreadOfPick.Create(NameStr,PwdStr) do
// 这时只能继承 TThread.Create ;重写一下构造,放在Private中 // 应该可以达到需要的效果
begin
if Suspended then Resume;
end;
Hyphoon 2003-02-12
  • 打赏
  • 举报
回复
To wjlsmail(计算机质子) :

好像不行喔, 虽然能防止访问私有曲内的构造器,但依然能直接直接访问父类中非私有的构造器!

Unit2中定义一个类

TA = class(TObject)
private
FStr : string;
constructor Creat; overload;
...

在Unit1中依然能这样调用:
la := TA.Create;
wjlsmail 2003-02-12
  • 打赏
  • 举报
回复
自己写类,将构造放在 私有区

16,749

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 语言基础/算法/系统设计
社区管理员
  • 语言基础/算法/系统设计社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧