C#/friendクラスの代替案 の履歴(No.1)
更新friend クラスとは†
密接に関連する2つのクラス、ClassA と ClassB とがあったとき、 他のクラスには公開しないが、お互いの間でのみ公開したいメソッドを 実装したくなる事が多々あります。
C++だとこのようなときに、お互いを friend クラスとして宣言することで、 外から見ると private なメソッドに自由にアクセスすることができるようになります。
C# では†
C# では friend はありません。
代わりに internal というのがあるのですが、friend に比べて公開される範囲が広すぎて 完全に代替とすることができないところです。
こういう場合、インターフェースを使うと、friend に似た効果を得られる事に気づきました。
当たり前の事なのかもしれませんが、不思議と他で同様の記事を発見できなかったので、 一応ここにメモしておきます。
public class ClassA: B.IClassA { void B.IClassA.privateMemberForClassB() { // このメンバーは private } }
public class B { internal interface IClassA { void privateMemberForClassB(); }
public AccessToPrivate(ClassA a) { // キャストしたときだけ操作できる ( (IClassA)a ).privateMemberForClassB(); } }
もちろん、同じアセンブリ内で、わざわざ a を B.IClassA にキャストするコードを 書けば該当コードにアクセスできてしまいますが、間違って呼び出してしまうとか、 インテリセンスを汚してしまうとか、そういった問題はこの方法で回避できると思います。
Counter: 48740 (from 2010/06/03),
today: 1,
yesterday: 8