我很喜欢 C++ 的友谊特性。说,我们有一个父母和孩子。Child 的 ctor 将 Parent 作为参数:
Child::Child(Parent & parent)
{
// Parent::RegisterChild is private
parent.RegisterChild(this);
}
由于友谊,Parent 和 Child 可能对自己保持相当安全的控制 - 例如,当 Child 更改 Parent 时,它可能会通知以前的 Parent,它想从它的 Child 列表中分离和新的 Parent,它想被附加到它的列表。此解决方案中的安全性意味着,派生自 Parent 或 Child 的任何类都不会破坏此机制。
不幸的是,C# 不提供友谊这样的特性。有一个internal
访问修饰符,但它限制了类元素对程序集的可见性,因此如果扩展程序集并引入新类,则该机制将不再安全。并且为了提供安全性而将这些类提取到单独的程序集中似乎是一个非常混乱的想法。
有没有办法使用现有的 C# 机制在两个类之间提供如此紧密和安全的合作,而这在派生类中是无法打破的?
编辑:回应评论
这不是信任问题,因为 - 正如 Eric 所说 - 有权访问源代码的人总是可以破坏它(删除私有修饰符,添加另一个朋友类,等等)。这是一种安全措施,旨在防止人们犯简单、愚蠢的错误,这些错误后来很难追踪。我使用朋友创建隔离机制,嵌入在基类中,在派生类中不能(或至少不容易)被破坏。这样我和我的同事都不必再担心这些了。