如题

解决方案 »

  1.   

    为什么不行?派生类难道不能访问到基类的proctectde的成员? 
        实际上在VCL中TObject.create是个没有任何操作的函数,这实际上是编译器默默的做了手脚 在通过类名调用构造函数实列化时编译器在构造函数之中添了一些列程,在内存只读区内编译器为每个类保存呢一个只读表(VMF),而类名实际是指向表的指针。在每个表中都有一项就是类所对应对象的大小,这个大小是编译器添进去的,也就是说,当我们通过类名调用构造函数为对象分配内存使,通过类名找到表,然后按表中的数据项(instancesize)分配大小。
      

  2.   

    Tobject的子类public了Create方法而且你改Delphi的VCL源码它是不会重新编译进去的
      

  3.   

    System.pas的代码是不允许更改的,
    如果让CREATE不能使用可以使用
    类的方法但是CREATE本来就是PUBLIC所以子类不能把他变为PRIVATE PROTECTED
      

  4.   

    Protected部分的方法的被访问范围是继承树中派生系列上的所有子类还有同一个单元中的友类你这样移动,当然可以访问了。另外,你直接去改VCL的原码,有点胆子太大了吧,小心自己把Delphi搞的都用不了了!
      

  5.   

    To FrameSniper   Delphi不会把你改过的VCL源码编译进去的
      

  6.   

    当前版本的Delphi是这样的,后裔类不能够隐藏祖先类公开了的方法或者属性另外, System单元是可以改的,但并不是里面所有的东西都可以改VCL源码的改动是可以连接到目标代码里面的
      

  7.   

    起码在Delphi的IDE里是不会把修改过的源码编译进去的吧
      

  8.   

    我认为, 改System.pas可能是可行的,但是:
    TObject是比较特殊的(比如说所有的类不声明父类的话会自动是TObject),尤其是构造方法,编译器会走后门。
    想点别的办法吧,比如加一下参数变成另一个版本,重载无参数版本,然后引发异常。(有一个同事的Singleton类就是这么做的)另外,权威的答案到 news://newsgroup.borland.com/public.delphi.language 上询问。
      

  9.   

    to 阿贵
    我确实是希望能够这样做到Singleton,你同事的做法对我很有启发,谢谢