电话
400 9058 355
友元类是为解决特定协作场景下深度交互与封装保护的矛盾而设,如容器与迭代器、类簇构造、单元测试等,需克制使用且明确声明。
友元类不是为了“打破封装”,而是为了解决特定协作场景下,类与类之间需要深度交互但又不便暴露公有接口的矛盾。它的使用应当克制、明确且有充分理由。
当两个类在逻辑上构成一个整体,比如容器类和它的迭代器类,迭代器必须能直接访问容器的底层指针或节点结构,但把所有成员设为 public 会破坏容器的数据完整性约束。此时将迭代器声明为容器的友元类,既保证了访问效率,又维持了封装边界——只有迭代器能越界访问,其他外部代码依然被隔离。
某些设计中,对外只暴露一个抽象接口类,而实际由多个具体实现类分工协作(如不同压缩格式的解码器)。主接口类可能需要创建并初始化这些实现类,并直接设置其私有状态(如缓冲区地址、解码上下文),但又不希望把这些初始化逻辑暴露为 public 接口。这时可将主接口类声明为各实现类的友元。
测试代码本身不属于产品模块,但需要检查类的私有成员是否按预期更新(例如缓存命中计数、状态机当前 stage)。将测试类(如 TestMyClass)声明为被测类的友元,可在测试中直接断言私有变量值,而不必为测试破环设计——无需添加仅供测试用的 public getter。
基本上就这些。友元类不是语法糖,而是协作契约——它让两个类在编译期就约定好“我信你,只信你”。用对了,代码更清晰;滥用,则封装形同虚设。
邮箱:8955556@qq.com
Q Q:8955556
本文详解如何将Go官方present工具(用于生成HTML5...
PySNMP在不同版本中对SNMP错误状态(errorSta...
time.Sleep仅阻塞当前goroutine,其他gor...
PHPfopen()创建含特殊符号的文件名失败主因是操作系统...
WooCommerce中通过代码为分组产品动态聚合子商品的属...
io.ReadFull返回io.ErrUnexpectedE...
本文详解Yii2中控制器向视图传递ActiveRecord数...
本文详解为何通过wp_set_object_terms()为...
Pytest中使用@mock.patch类装饰器会导致补丁泄...
带缓冲的channel是并发安全的FIFO队列;make(c...