我同意评论说如果明智地使用了friend关键字可以改进封装.我只想补充说,朋友类最常见(合法!)的使用可能正在测试.您可能希望测试人员类具有比其他客户端类更大的访问权限.测试者类可以有充分的理由查看故意隐藏在其他类中的内部细节.
我同意评论说如果明智地使用了friend关键字可以改进封装.我只想补充说,朋友类最常见(合法!)的使用可能正在测试.您可能希望测试人员类具有比其他客户端类更大的访问权限.测试者类可以有充分的理由查看故意隐藏在其他类中的内部细节.
根据我的经验,与用于打破封装的频率相比,实际增强数据封装的朋友(或可变,有点相似)的情况很少见.
它对我来说很少有用,但是当我使用它时,我必须将以前是单个类的类分成两个需要访问一些常用数据/功能的独立类.
编辑以回应Outlaw Programmer的评论:我们绝对同意这一点.分开它们之后除了朋友的类之外的另一个选择是制作公共访问者,这有时会破坏封装!我认为有些人认为友好类会以某种方式打破封装,因为他们已经看到它使用不当,许多人可能永远不会看到正确使用的代码,因为这是一件罕见的事情.我喜欢你的陈述方式 - 友善是一个很好的中间地带,不允许你分开你的课堂,让所有人都可以进入公众.
编辑以响应David Thornley:我同意C++允许您执行此类操作的灵活性是C++中进行设计决策的结果.我认为这就是了解灵活语言中哪些东西通常是好的和坏的更重要.Java的观点是你永远不应该有朋友类,以便不提供这些类,但作为C++程序员,我们作为一个社区的责任是定义这些非常灵活但有时被滥用的语言结构的恰当使用.
编辑以响应Tom:Mutable并不一定会打破封装,但是我在实际情况中看到的mutable关键字的许多用法都破坏了封装,因为看到人们破坏封装的可变性比通常更容易实际上,首先找到并理解正确使用mutable.
当你希望一个类(Factory)负责创建另一个类的实例(Type)时.您可以使Type的构造函数为private,从而确保只有Factory可以创建Type对象.当您希望将检查委托给可以作为验证器的其他类时,它非常有用.只是一种使用场景.
PS真的错过了C#中的"friend"关键字...
具体实例是类工厂,您希望只通过另一个工厂类创建一个类,因此您将构造函数设置为private,并将工厂类作为生成的类的朋友.
它有点'像一个2"12点3/4"驱动插座 - 不是非常常见,但是当你需要它时,你很高兴你拥有它.