好像这个并不矛盾啊。既然Property声明的了Write的方式是SetName,那么自然调用SetName方法了。这个并没有对子类可视,你的子类也不可能访问TA的私有变量。另XML的书,可以看看Wrox出版社的一些书,比如Professional XML等等。XML本身并不复杂。

解决方案 »

  1.   

    chechy大侠,你已经康复了吗?多保重身体啊
    我很久没来CSDN,不知你什么时候回来的
    windofsun,不好意思,借用了一下你的帖子
      

  2.   

    那如果写成read FName write FName,那不是直接访问父类的私有变量了吗?
      

  3.   

    不是,只是编译器在编译时候进行替换,但是并不意味着访问了私有变量。
    就以你这个例子来说:当今后,你由于某种需要,在Name属性写的时候,还需要修改其他变量,那么你可以把属性变为
    property Name read FName write SetName;
    并在SetName中做适当地代码。对于外部调用TA.Name的代码来说,它们无须任何修改,但是在TA.Name被写时将有额外的变化,这就是封装的意义所在。如果是普通的变量就没有这个能量。TO dancemaple:我还没好,现在挺痛苦的。不过还是谢谢关心。
      

  4.   

    呵呵,我的想法是!read ... write ...是提供外界访问内部数据的方法!
    如果这种访问机制都没有,对象也无法于外界交流了!
      

  5.   

    chechy老大,我用InstanceSize查看对象的空间大小,发现TA的私有变量增加的话,TB的对象的大小也相应的增加,两者得到的数值总是相等的。TB对象也为TA的私有变量分配了空间吗?(可能这种提法不对)
      

  6.   

    面向对象有一个特性,就是父亲的一切东西,儿子都有。虽然,TB不能访问TA的私有变量,但是TB通过调用TA的方法一样会对这些变量进行操作,所有当然要全部都有了。
    另外,面向对象,在具体的编译实现上,我不是非常清楚。某些可能是我的猜测。
      

  7.   

    唉你们都忽略了一点
    那就是对delphi来说同一个单无unit内
    没有private和protected与public之分
    想访问谁就访问谁
    这就是奇怪的oop友元
      

  8.   

    看了各位的发言感觉长了很多知识;
    谢了。
    以下纯属个人虚构,如有雷同亦属瞎蒙-->
    是不是TB通过其父类TA中的公有Peroperty name调用了TA的私有方法;这样话就应该是水到渠成了。
      

  9.   

    谁知道哪有DELPHI方面论述OOP,DELPHI的面向对象的论述并不多.
      

  10.   

    你的观察角度不对!>>OOP中一个非常重要的概念就是封装
    想想为什么要封装? 比如我们做了一个 MusicPlayer 它有5个功能键 ,Play Pause Next Prev Stop 这个5个功能键内部都封装了很多东西,而这5个功能他们的实现当然是需要和这个MusicPlayer内部的数据打交道。 你无需了解它们的内部如何实现,你只要调用它们就可以了
    一个使用者 何必去想它们是如何实现的呢?
      

  11.   

    我觉得这并不矛盾,正如windofsun说的"子类继承父类的公开属性,也间接访问了父类的私有变量",不管怎么说,直接能访问的只有公开的属性和方法,至于能不能通过公开属性和方法访问私有变量和成员函数,完全是由父类实现决定的,把它称为“间接访问”可能不太合适。
      

  12.   

      很多人对于存取特性的看法存在偏差,应该说,可见性与可存取(访问)性不是一个等同的概念,对于方法(函数+过程),其特性仅仅是 -- 
                                           (1)名字
                                           (2)参数个数,型态,顺序
    -- 不涉及可见性原则!
      因此,函数的(Overload)忽略了存取原则,更好玩的东东,请大家推理!-- 一点谬论
      

  13.   

    非常同意initora(ivariant)的看法。
      

  14.   

    就这个例子来说,TB没有扩充新的变量或属性,它的实例的大小总是和TA相等,是不是也为它分配了TA私有变量的空间,并将其值复制到B的相应空间呢?
      

  15.   

    我觉得属性只不过是提供给外界一种访问数据的一种更方便的方法,是一种中转
    如果没有属性的话,势必得写一对Get和Set方法,并把它Public出去
      

  16.   

    TB肯定是复制了TA的私有变量的空间
    因为TA如有一protected方法对私有变量操作,那子类在用这个方法时
    如果没有这一块空间,岂不是要出错
      

  17.   

      任何程式发展语言其时都是大同小异,Object Pascal巧妙地使用inherited替代了C++中的成员初始化列表,干着同一件事,初始化祖先类别的“成员”,以使用祖先的东东 -- 方法公用,数据独立,不过Object Pascal 更为拥护OO,接口与实现的严格区分,简单的inherited之所以简单,是因为客户程序员必须明确地Create it when use. 这也是为什麽我们如此钟情于Delphi的原因之一,不是吗?
      -- 推荐, 老奈的文章!
      

  18.   

    在这个例子里面,生成TB的对象B时,分配了与TA的实例相同大小的空间。假如B对应于TA的FName变量的内存空间是0000:0000--0000:00FF,那么给B.Name赋值时,是不是把“aaaaaa”放入这个内存区域呢?
      

  19.   

    FName为一String变量,其实就是一指向堆中一段内存的指针,当赋值时会被赋值为一指针值
    你可能说的不是这意思,如有一整型私有变量,那我觉得就放入它占有的内存区
    我也不太懂,不敢乱说,呵呵
      

  20.   

    我不是针对string,而是指私有变量和属性