有一个基类TA声明在Uni1,有一个私有字段s。
有一个派生类TB声明在Uni2。那么我问,TB中有没有s字段?
答案是有,就是说Private字段也能被继承?Java中应该是不能的。
那s能不能访问?答案是有时能访问有时不能访问,如果你把一个TB类型的变量声明在Unit1中,就能访问,声明在Uni2中就不能访问。
Delphi将它的对象模型和文件组织结构纠缠在了一起,这我觉得是很不明智的。

解决方案 »

  1.   

    "Delphi将它的对象模型和文件组织结构纠缠在了一起,这我觉得是很不明智的"仅是指在同1个单元而已,没有那么严重
      

  2.   

    Delphi中的private是限制同一个单元
      

  3.   

    那这种private就比较的假了,我个人还是觉得非常不好。
    举个例子:
    我不希望两个类是友员类,那就只能把这两个类声明在不同的pas中,但是如果A类中包含了一个B类类型成员,B类中又有一个A类类型成员,这就要求Unit1 uses Unit2并且Unit2 uses Unit1,这是没有办法实现的,在单元的接口节的uses不允许循环引用。
      

  4.   

    在单元的interface里面是不能循环引用,但implementation里面可以。
    但同一个单元里面互为友元类,这个设计确实不好。
      

  5.   

    unit 2 的 TB 有 s 私有成员,不能访问而已
    同一单元下的都是友元,这是 delphi约定
    c++中要显式指明友元,有经验的人都会发现,这个友元不好指明,当在写基类时,没想过有友元,完全有可能发生要申明一个友元,但这个类是之前写好的
    delphi这个约定有好处
      

  6.   

    从Delphi 2005开始Win32和.NET的编译器都支持strict private关键字,这个就可以实现完全的private了。你可以试试看。我也不是很喜欢默认的友元类。