社区
语言基础/算法/系统设计
帖子详情
如何能防止一个类的构造函数被外界直接访问?
Hyphoon
2003-02-12 03:23:21
在单件(Singleton)模式中,要求构造器是被保护的, 那在Delphi如何实现?就算把子类的构造器保护起来,构造器都可以直接访问, 只不过访问的是父类中没保护起来的构造器?
...全文
104
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
打赏
举报
回复
自己写类,将构造放在 私有区
类string的
构造
函数
、拷贝
构造
函数
和析构
函数
2013-4-29阅读361 评论2
构造
函数
、析构
函数
与赋值
函数
是每个类最基本的
函数
。...每个类只有一个析构
函数
和一个赋值
函数
,但可以有多个
构造
函数
(包含一个拷贝
构造
函数
,其它的称为普通
构造
类String的
构造
函数
拷贝
构造
函数
和析构
函数
每个类只有一个析构
函数
和一个赋值
函数
,但可以有多个
构造
函数
(包含一个拷贝
构造
函数
,其它的称为普通
构造
函数
)。对于任意一个类A,如果不想编写上述
函数
,C++编译器将自动为A产生四个缺省的
函数
(也只是在需要的...
C++
构造
函数
类型
通常我们将类中的数据成员定义为私有的,达到数据与
外界
隔离的目的,在类外无法
访问
类的数据成员,那么我们如何为类赋初值呢。 1、是否可以通过在定义类的时候
直接
对变量成员赋初值呢?像这样 class Point{ int...
构造
函数
,静态,主
函数
,静态代码块初始化执行顺序
/*
构造
函数
里参数不同给不同的对象初始化,...如传递的参数类型不同,运行的
构造
函数
不同,而代码块是创建了对象后就
直接
运行,与参数无关且优先于有参数传递
构造
函数
。 外如果构建的类没有自定义
构造
函数
其系统会
7.
构造
函数
和方法
1.
构造
函数
的规则和语法; 2.创建对象时内存的分配情况; 3.
构造
函数
的使用; 4.方法签名和调用; 5.
构造
函数
和方法参数的两种参数传递方式(值传递和引用传递) 6.变量作用域和关键字(this/super)
语言基础/算法/系统设计
16,749
社区成员
33,245
社区内容
发帖
与我相关
我的任务
语言基础/算法/系统设计
Delphi 语言基础/算法/系统设计
复制链接
扫一扫
分享
社区描述
Delphi 语言基础/算法/系统设计
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章