Delphi面向对象机制的困惑 好像这个并不矛盾啊。既然Property声明的了Write的方式是SetName,那么自然调用SetName方法了。这个并没有对子类可视,你的子类也不可能访问TA的私有变量。另XML的书,可以看看Wrox出版社的一些书,比如Professional XML等等。XML本身并不复杂。 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 chechy大侠,你已经康复了吗?多保重身体啊我很久没来CSDN,不知你什么时候回来的windofsun,不好意思,借用了一下你的帖子 那如果写成read FName write FName,那不是直接访问父类的私有变量了吗? 不是,只是编译器在编译时候进行替换,但是并不意味着访问了私有变量。就以你这个例子来说:当今后,你由于某种需要,在Name属性写的时候,还需要修改其他变量,那么你可以把属性变为property Name read FName write SetName;并在SetName中做适当地代码。对于外部调用TA.Name的代码来说,它们无须任何修改,但是在TA.Name被写时将有额外的变化,这就是封装的意义所在。如果是普通的变量就没有这个能量。TO dancemaple:我还没好,现在挺痛苦的。不过还是谢谢关心。 呵呵,我的想法是!read ... write ...是提供外界访问内部数据的方法!如果这种访问机制都没有,对象也无法于外界交流了! chechy老大,我用InstanceSize查看对象的空间大小,发现TA的私有变量增加的话,TB的对象的大小也相应的增加,两者得到的数值总是相等的。TB对象也为TA的私有变量分配了空间吗?(可能这种提法不对) 面向对象有一个特性,就是父亲的一切东西,儿子都有。虽然,TB不能访问TA的私有变量,但是TB通过调用TA的方法一样会对这些变量进行操作,所有当然要全部都有了。另外,面向对象,在具体的编译实现上,我不是非常清楚。某些可能是我的猜测。 唉你们都忽略了一点那就是对delphi来说同一个单无unit内没有private和protected与public之分想访问谁就访问谁这就是奇怪的oop友元 看了各位的发言感觉长了很多知识;谢了。以下纯属个人虚构,如有雷同亦属瞎蒙-->是不是TB通过其父类TA中的公有Peroperty name调用了TA的私有方法;这样话就应该是水到渠成了。 谁知道哪有DELPHI方面论述OOP,DELPHI的面向对象的论述并不多. 你的观察角度不对!>>OOP中一个非常重要的概念就是封装想想为什么要封装? 比如我们做了一个 MusicPlayer 它有5个功能键 ,Play Pause Next Prev Stop 这个5个功能键内部都封装了很多东西,而这5个功能他们的实现当然是需要和这个MusicPlayer内部的数据打交道。 你无需了解它们的内部如何实现,你只要调用它们就可以了一个使用者 何必去想它们是如何实现的呢? 我觉得这并不矛盾,正如windofsun说的"子类继承父类的公开属性,也间接访问了父类的私有变量",不管怎么说,直接能访问的只有公开的属性和方法,至于能不能通过公开属性和方法访问私有变量和成员函数,完全是由父类实现决定的,把它称为“间接访问”可能不太合适。 很多人对于存取特性的看法存在偏差,应该说,可见性与可存取(访问)性不是一个等同的概念,对于方法(函数+过程),其特性仅仅是 -- (1)名字 (2)参数个数,型态,顺序-- 不涉及可见性原则! 因此,函数的(Overload)忽略了存取原则,更好玩的东东,请大家推理!-- 一点谬论 非常同意initora(ivariant)的看法。 就这个例子来说,TB没有扩充新的变量或属性,它的实例的大小总是和TA相等,是不是也为它分配了TA私有变量的空间,并将其值复制到B的相应空间呢? 我觉得属性只不过是提供给外界一种访问数据的一种更方便的方法,是一种中转如果没有属性的话,势必得写一对Get和Set方法,并把它Public出去 TB肯定是复制了TA的私有变量的空间因为TA如有一protected方法对私有变量操作,那子类在用这个方法时如果没有这一块空间,岂不是要出错 任何程式发展语言其时都是大同小异,Object Pascal巧妙地使用inherited替代了C++中的成员初始化列表,干着同一件事,初始化祖先类别的“成员”,以使用祖先的东东 -- 方法公用,数据独立,不过Object Pascal 更为拥护OO,接口与实现的严格区分,简单的inherited之所以简单,是因为客户程序员必须明确地Create it when use. 这也是为什麽我们如此钟情于Delphi的原因之一,不是吗? -- 推荐, 老奈的文章! 在这个例子里面,生成TB的对象B时,分配了与TA的实例相同大小的空间。假如B对应于TA的FName变量的内存空间是0000:0000--0000:00FF,那么给B.Name赋值时,是不是把“aaaaaa”放入这个内存区域呢? FName为一String变量,其实就是一指向堆中一段内存的指针,当赋值时会被赋值为一指针值你可能说的不是这意思,如有一整型私有变量,那我觉得就放入它占有的内存区我也不太懂,不敢乱说,呵呵 我不是针对string,而是指私有变量和属性 多个资源文件释放的问题 SPCOMM通过串口控制投影机的问题,大家来帮忙呀!! intraweb中的IWtreeview点击事件问题 (女程序员) 50分求一个数据库! 我要把查询出来的结果生成XML的格式,怎么做? window API函数 Delphi联接DBF数据库的问题 帮忙? datetimepicker的用法 如何在程序中激活一个可执行程序? application.handle的属性可否通过用API函数获得? 3000-5000元寻求软件开发合作!
我很久没来CSDN,不知你什么时候回来的
windofsun,不好意思,借用了一下你的帖子
就以你这个例子来说:当今后,你由于某种需要,在Name属性写的时候,还需要修改其他变量,那么你可以把属性变为
property Name read FName write SetName;
并在SetName中做适当地代码。对于外部调用TA.Name的代码来说,它们无须任何修改,但是在TA.Name被写时将有额外的变化,这就是封装的意义所在。如果是普通的变量就没有这个能量。TO dancemaple:我还没好,现在挺痛苦的。不过还是谢谢关心。
如果这种访问机制都没有,对象也无法于外界交流了!
另外,面向对象,在具体的编译实现上,我不是非常清楚。某些可能是我的猜测。
那就是对delphi来说同一个单无unit内
没有private和protected与public之分
想访问谁就访问谁
这就是奇怪的oop友元
谢了。
以下纯属个人虚构,如有雷同亦属瞎蒙-->
是不是TB通过其父类TA中的公有Peroperty name调用了TA的私有方法;这样话就应该是水到渠成了。
想想为什么要封装? 比如我们做了一个 MusicPlayer 它有5个功能键 ,Play Pause Next Prev Stop 这个5个功能键内部都封装了很多东西,而这5个功能他们的实现当然是需要和这个MusicPlayer内部的数据打交道。 你无需了解它们的内部如何实现,你只要调用它们就可以了
一个使用者 何必去想它们是如何实现的呢?
(1)名字
(2)参数个数,型态,顺序
-- 不涉及可见性原则!
因此,函数的(Overload)忽略了存取原则,更好玩的东东,请大家推理!-- 一点谬论
如果没有属性的话,势必得写一对Get和Set方法,并把它Public出去
因为TA如有一protected方法对私有变量操作,那子类在用这个方法时
如果没有这一块空间,岂不是要出错
-- 推荐, 老奈的文章!
你可能说的不是这意思,如有一整型私有变量,那我觉得就放入它占有的内存区
我也不太懂,不敢乱说,呵呵