在下面这个帖中所提出的问题,究竟是不是友元问题,欢迎讨论。
http://expert.csdn.net/Expert/topic/2363/2363045.xml?temp=.4442407 我个人认为这个问题不是友元问题,所谓友元类,必须是两个类之间的关系,TComponent和TComponent是两个不同的类吗?显然不是,所以楼主的问题只能解释为一个类对自身的实例引用,对自身的实例引用当然可以访问其私有成员。这个问题在C++的操作符重载中经常见到,因为在C++中的友元关系必须用关键字定义,所以很明确,也没有听说或在那本书上看到这是个友元问题,只是解释为“一个类对自身的实例引用”。所谓“自己和自己肯定是友员”的解释是不正确的,说“自己和自己类似友元关系”到可以说得过去。
当然我的见解也可能不正确或者不完整,希望大家能引经据典的把这个问题搞清楚!
http://expert.csdn.net/Expert/topic/2363/2363045.xml?temp=.4442407 我个人认为这个问题不是友元问题,所谓友元类,必须是两个类之间的关系,TComponent和TComponent是两个不同的类吗?显然不是,所以楼主的问题只能解释为一个类对自身的实例引用,对自身的实例引用当然可以访问其私有成员。这个问题在C++的操作符重载中经常见到,因为在C++中的友元关系必须用关键字定义,所以很明确,也没有听说或在那本书上看到这是个友元问题,只是解释为“一个类对自身的实例引用”。所谓“自己和自己肯定是友员”的解释是不正确的,说“自己和自己类似友元关系”到可以说得过去。
当然我的见解也可能不正确或者不完整,希望大家能引经据典的把这个问题搞清楚!
if AOwner <> nil then AOwner.InsertComponent(Self); 将TComponent加入容器AInsert(AComponent); 传递的是容器AFComponents.Add(AComponent); 将容器A加入TListAComponent.FOwner := Self; 将TComponent赋给容器A的FOwner,当然是合法的,不是什么友元之类问题,(Delphi中没有真正意义上的友元)
结论:
按照各种Delphi上说,Delphi中没有明确定义友元,但是具有类似友元的功能,即同一个单元中定义的类互为友元,对同一单元中不同的类相信大家没有异议,但对于一个类对本身实例的引用,有两种看法,一种是认为这也是友元关系,理由是既然同一个单元中定义的类互为友元,一个类对自身实例的引用可看作特殊的友元关系,或者干脆说“自己和自己肯定是友员”;另一种看法则认为这只能叫“对自身实例的引用”,不是什么友元关系,理由是既然Delphi中没有明确定义友元关系,可以比照其他OO语言,如C++来说明这个问题,C++对于友元关系的定义必须使用friend关键字,而一个类中往往大量使用对自身实例的引用,如拷贝构造函数、运算符重载等,由于没有关键字定义,不能说是友元关系,事实上也从没有任何人或资料说这是一种友元关系,只是说是自身实例的引用。
现在这两种看法,应该说都有道理,又都道理不够充分,而且没有谁能真正“引经据典”把这个问题说透彻,只好去问Borland了,但是不管怎样,如果一个类不能引用自身实例,实在是说不过去,是友元也好,不是也罢,无论是Delphi,还是C++,大家都这么用,我们就这么用吧!
不过,如果不是原帖的楼主已经部分的理解错误(我自己的认为),我是不会浪费200分来发这个帖的(不过分多并不心疼),请看原帖楼主的部分理解,我就不评论了,谁有兴趣谁去分析他理解了什么:
(3)insert 可以看作 Classes 单元中 所有定义类的一个友元函数。
(4)insert 最后被派生类继承了(的确继承了,但是在派生类中不能访问,因为他是私有的),
(5)insert 是classes中所定义的的类的友元函数 这一点在TComponet的派生类是没有变化的。
(6)Insert 仅能访问classes中所定义的的类的私有数据,不能访问派生类的私有数据。