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