我很喜歡C++的友情功能。說,我們有一個家長和孩子。孩子的構造函數需要家長作爲參數:如何克服C#中缺乏友誼?
Child::Child(Parent & parent)
{
// Parent::RegisterChild is private
parent.RegisterChild(this);
}
由於友誼,父母與子女可以隨自己保持相當的安全控制 - 例如,當孩子改變家長,它可以通知前面的家長,它想成爲從其子項列表和新父項中分離出來,並將其附加到其列表中。這個解決方案的安全性意味着沒有任何來自Parent或Child的類可能會破壞這個機制。
不幸的是,C#不提供這樣的功能,如友誼。有一個internal
訪問修飾符,但是它限制類元素大會的知名度,所以如果一個擴展組件,並引入新的類,該機制將不再是安全的。提取這些類來分離組件以提供安全性似乎是一個非常混亂的想法。
是否有使用現有的C#機制來提供兩個類,不能在派生類中被打破之間的這種密切和安全合作的方式?
編輯:針對評論
這不是信任的問題,因爲 - 正如埃裏克說 - 人,誰有權訪問的源代碼可以隨時打破它(刪除私人改性劑,添加另一個朋友類,不管)。這是一項安全措施,旨在防止人們犯下簡單,愚蠢的錯誤,後來很難跟蹤。我使用朋友來創建獨立的機制,嵌入基類中,這些機制在派生類中不能(或至少不能輕易地)被破壞。這樣,我和我的同事都不必擔心這些。
我在C#中使用'private'訪問說明符並使用名爲'IFriendKey'的接口實現了類似於朋友的功能。 – Nawaz
針對什麼攻擊不「安全」? 「內部」首先不是*安全*功能,因此提到「安全」是不起作用的。如果你的同事不能正確使用內部,那麼你認爲他們會正確使用「朋友」的原因是什麼?對於這一點,如果你不相信你的同事正確使用你的內部成員,那你爲什麼要給他們寫入源代碼的權限? –
@EricLippert:通過「安全」,他可能意味着你通過使代碼的一部分「私人」,其他一些「受保護」等等達到同樣的目的。換句話說,如果你信任你的同事,那麼這是否意味着你不使用'private'? – Nawaz