我将System.pas单元的TObject的Create方法移到了protected中,但是不管用,从TObject继承的类照样可以调用Create实例化,为什么? 如题 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 为什么不行?派生类难道不能访问到基类的proctectde的成员? 实际上在VCL中TObject.create是个没有任何操作的函数,这实际上是编译器默默的做了手脚 在通过类名调用构造函数实列化时编译器在构造函数之中添了一些列程,在内存只读区内编译器为每个类保存呢一个只读表(VMF),而类名实际是指向表的指针。在每个表中都有一项就是类所对应对象的大小,这个大小是编译器添进去的,也就是说,当我们通过类名调用构造函数为对象分配内存使,通过类名找到表,然后按表中的数据项(instancesize)分配大小。 Tobject的子类public了Create方法而且你改Delphi的VCL源码它是不会重新编译进去的 System.pas的代码是不允许更改的,如果让CREATE不能使用可以使用类的方法但是CREATE本来就是PUBLIC所以子类不能把他变为PRIVATE PROTECTED Protected部分的方法的被访问范围是继承树中派生系列上的所有子类还有同一个单元中的友类你这样移动,当然可以访问了。另外,你直接去改VCL的原码,有点胆子太大了吧,小心自己把Delphi搞的都用不了了! To FrameSniper Delphi不会把你改过的VCL源码编译进去的 当前版本的Delphi是这样的,后裔类不能够隐藏祖先类公开了的方法或者属性另外, System单元是可以改的,但并不是里面所有的东西都可以改VCL源码的改动是可以连接到目标代码里面的 起码在Delphi的IDE里是不会把修改过的源码编译进去的吧 我认为, 改System.pas可能是可行的,但是:TObject是比较特殊的(比如说所有的类不声明父类的话会自动是TObject),尤其是构造方法,编译器会走后门。想点别的办法吧,比如加一下参数变成另一个版本,重载无参数版本,然后引发异常。(有一个同事的Singleton类就是这么做的)另外,权威的答案到 news://newsgroup.borland.com/public.delphi.language 上询问。 to 阿贵我确实是希望能够这样做到Singleton,你同事的做法对我很有启发,谢谢 DELPHI如何实现IE拨号网络代理IP的设置 更改jpg的dpi问题~ Fastreport怎么了?以前不断出新版本,这下怎么冷静了那么久? 关于静态变量的定义 SetSystemPowerState函数,请问谁会用? 谁知道modem 返回状态 例如 返回‘ok’ 请教怎么读取文本中有用的数据? 如何将DATASET导出为WORD文档? 怎样对一个DOS格式的文本文件进行操作? 如何连MSSERVER数据库 !!!!!我做的软件上所有的中文怎么到别的机子上就面目全非!!!!!! 急(在线等待)
实际上在VCL中TObject.create是个没有任何操作的函数,这实际上是编译器默默的做了手脚 在通过类名调用构造函数实列化时编译器在构造函数之中添了一些列程,在内存只读区内编译器为每个类保存呢一个只读表(VMF),而类名实际是指向表的指针。在每个表中都有一项就是类所对应对象的大小,这个大小是编译器添进去的,也就是说,当我们通过类名调用构造函数为对象分配内存使,通过类名找到表,然后按表中的数据项(instancesize)分配大小。
如果让CREATE不能使用可以使用
类的方法但是CREATE本来就是PUBLIC所以子类不能把他变为PRIVATE PROTECTED
TObject是比较特殊的(比如说所有的类不声明父类的话会自动是TObject),尤其是构造方法,编译器会走后门。
想点别的办法吧,比如加一下参数变成另一个版本,重载无参数版本,然后引发异常。(有一个同事的Singleton类就是这么做的)另外,权威的答案到 news://newsgroup.borland.com/public.delphi.language 上询问。
我确实是希望能够这样做到Singleton,你同事的做法对我很有启发,谢谢