社区
语言基础/算法/系统设计
帖子详情
如何能防止一个类的构造函数被外界直接访问?
Hyphoon
2003-02-12 03:23:21
在单件(Singleton)模式中,要求构造器是被保护的, 那在Delphi如何实现?就算把子类的构造器保护起来,构造器都可以直接访问, 只不过访问的是父类中没保护起来的构造器?
...全文
178
13
打赏
收藏
如何能防止一个类的构造函数被外界直接访问?
在单件(Singleton)模式中,要求构造器是被保护的, 那在Delphi如何实现?就算把子类的构造器保护起来,构造器都可以直接访问, 只不过访问的是父类中没保护起来的构造器?
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用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
打赏
举报
回复
自己写类,将构造放在 私有区
编写
一个
单实例的
类
,让
外界
访问
本文深入探讨了单例设计模式的实现原理,介绍了如何通过私有
构造函数
和静态方法确保
一个
类
仅有
一个
实例,并提供了全局
访问
该实例的方法。通过双锁检测DCL版本的实例化过程,保证了线程安全。
c++如何
防止
一个
类
被其他
类
继承?
本文探讨了在C++中如何
防止
一个
类
被其他
类
继承,通过将
构造函数
设为私有并利用友元特性,既保持
类
的完整性,又避免了继承。同时解释了为何需要虚拟继承。
如何
防止
一个
类
被继承
本文探讨了在C++中如何
防止
一个
类
被其他
类
继承。通过将
构造函数
设为私有并借助友元
类
,可以有效阻止继承,同时解释了为何C
类
需要虚拟继承BASE
类
。
C++中
防止
一个
类
被继承
本文探讨了如何在C++中
防止
一个
类
被继承,主要介绍了两种方法:将
构造函数
和析构函数设为私有,以及使用虚拟继承。通过这些方法,可以阻止子
类
调用父
类
的构造和析构,实现
类
的不可继承性。同时,文章通过代码示例和分析解释了这两种方法的工作原理和限制。
防止
恶意解析(禁止通过IP
直接
访问
)
本文介绍了如何通过Apache、Tomcat和Nginx服务器配置,
防止
恶意解析并仅允许通过特定域名
访问
网站,以避免因IP
直接
访问
导致的风险。,
语言基础/算法/系统设计
16,741
社区成员
33,233
社区内容
发帖
与我相关
我的任务
语言基础/算法/系统设计
Delphi 语言基础/算法/系统设计
复制链接
扫一扫
分享
社区描述
Delphi 语言基础/算法/系统设计
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章