C#/friendクラスの代替案 のバックアップ差分(No.1)

更新


  • 追加された行はこの色です。
  • 削除された行はこの色です。
[[公開メモ]]

* friend クラスとは [#t75f84fc]

密接に関連する2つのクラス、ClassA と ClassB とがあったとき、
他のクラスには公開しないが、お互いの間でのみ公開したいメソッドを
実装したくなる事が多々あります。

C++だとこのようなときに、お互いを friend クラスとして宣言することで、
外から見ると private なメソッドに自由にアクセスすることができるようになります。

* C# では [#med36db1]

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: 37514 (from 2010/06/03), today: 3, yesterday: 0