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: 50200 (from 2010/06/03),
today: 1,
yesterday: 2