社区
语言基础/算法/系统设计
帖子详情
如何能防止一个类的构造函数被外界直接访问?
Hyphoon
2003-02-12 03:23:21
在单件(Singleton)模式中,要求构造器是被保护的, 那在Delphi如何实现?就算把子类的构造器保护起来,构造器都可以直接访问, 只不过访问的是父类中没保护起来的构造器?
...全文
114
13
打赏
收藏
如何能防止一个类的构造函数被外界直接访问?
在单件(Singleton)模式中,要求构造器是被保护的, 那在Delphi如何实现?就算把子类的构造器保护起来,构造器都可以直接访问, 只不过访问的是父类中没保护起来的构造器?
复制链接
扫一扫
分享
转发到动态
举报
AI
作业
写回复
配置赞助广告
用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的
构造函数
、拷贝
构造函数
和析构函数
http://m.blog.csdn.net/blog/aoxiangzhiguanjun/8868207 2013-4-29阅读361 评论2
构造函数
、析构函数与赋值函数是每个
类
最基本的函数。它们太普通以致让人容易麻痹大意,其实这些貌似简单的函数就象没有顶盖的下水道那样危险。 每个
类
只有
一个
析构函数和
一个
赋值函数,但可以有多个
构造函数
(包含
一个
拷贝
构造函数
,其它的称为普通构造
类
String的
构造函数
拷贝
构造函数
和析构函数
构造函数
、析构函数与赋值函数是每个
类
最基本的函数。它们太普通以致让人容易麻痹大意,其实这些貌似简单的函数就象没有顶盖的下水道那样危险。 每个
类
只有
一个
析构函数和
一个
赋值函数,但可以有多个
构造函数
(包含
一个
拷贝
构造函数
,其它的称为普通
构造函数
)。对于任意
一个
类
A,如果不想编写上述函数,C++编译器将自动为A产生四个缺省的函数(也只是在需要的时候才会产生),如 A(void); // 缺省的无参数
构造函数
,静态,主函数,静态代码块初始化执行顺序
/*
构造函数
里参数不同给不同的对象初始化,不同的参数分别传递到不同的
构造函数
中。 构造代码块 作用:给对象进行初始化和
构造函数
还是有差距的,优先于
构造函数
构造代码块给所有对象进行统一初始化,而
构造函数
给相应对象进行初始化, 如传递的参数
类
型不同,运行的
构造函数
不同,而代码块是创建了对象后就
直接
运行,与参数无关且优先于有参数传递
构造函数
。 外如果构建的
类
没有自定义
构造函数
其系统会
C++
构造函数
类
型
目录 什么是
构造函数
默认
构造函数
转换
构造函数
复制
构造函数
(拷贝
构造函数
) 深拷贝和浅拷贝 析构函数三法则 什么是
构造函数
通常我们将
类
中的数据成员定义为私有的,达到数据与
外界
隔离的目的,在
类
外无法
访问
类
的数据成员,那么我们如何为
类
赋初值呢。 1、是否可以通过在定义
类
的时候
直接
对变量成员赋初值呢?像这样 class Point{ int x = 0 , y = 0; ... } 答案是否定的,因为
类
只有在创建对...
C++对象的
构造函数
和析构函数详解
C++对象的
构造函数
和析构函数详解 你好,C++(33)对象生死两茫茫 6.2.3
一个
对象的生与死:
构造函数
和析构函数 6.2.2 使用
类
创建对象 完成某个
类
的声明并且定义其成员函数之后,这个
类
就可以使用了。
一个
定义完成的
类
就相当于一种新的数据
类
型,我们可以用它来定义变量,也就是创建这个
类
所描述的对象,表示现实世界中的各种实体。比如前面完成了Teacher
类
的声明和定义,就可以
语言基础/算法/系统设计
16,747
社区成员
33,239
社区内容
发帖
与我相关
我的任务
语言基础/算法/系统设计
Delphi 语言基础/算法/系统设计
复制链接
扫一扫
分享
社区描述
Delphi 语言基础/算法/系统设计
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章