2012-01-20 13 views
0

私はC#でユニオン検索のデータ構造を実装しています。要素はElement内部クラスを拡張する必要がありますが、そのクラスのフィールドを外部世界に限定して保持したいと思います。しかし、彼らは直接的な外部階級に公衆である必要があります。 folloowingコードが原因「一貫性のないアクセス」にコンパイルされません。準プライベート内部クラス

class DisjointSetForrests<T> where T : DisjointSetForrests<T>.Element { 

    private class PrivateElement { 
     public Element p; 
     public int  rank; 
    } 

    public class Element : PrivateElement { 
    } 

    public void MakeSet(T x) { 
     x.p = x; 
     x.rank = 0; 
    } 

    public T FindSet(T x) { 
     if (x != x.p) x.p = FindSet(x); 
     return (T)x.p; 
    } 

    public void Union(T x, T y) { 
     Link(FindSet(x), FindSet(y)); 
    } 

    public void Link(T x, T y) { 
     if (x.rank > y.rank) { 
      y.p = x; 
     } else { 
      x.p = y; 
      if (x.rank == y.rank) y.rank++; 
     } 
    } 
} 

私が望むものを達成するための方法はありますか、私は要素である公共の場でのフィールドを受け入れる必要がありますか?

+0

[C#自身の内部でネストされたクラスから継承する]の可能な複製(http://stackoverflow.com/questions/2158975/c-sharp-inherit-from-nested-class-within-itself) – nawfal

答えて

1

外部クラスにのみ公開することはできません。 質問はなぜそれらを公開しておく必要がありますか?ライブラリを作成する場合は、internalを使用できます。

+0

+1。また、保護しようとすることができます。 –

+0

@ Dr.AndrewBurnett-Thompsonありがとうございました。 'DisjointSetForrests 'は 'Element'クラスを拡張していないので、Protectedはこの場合には機能しません。 –

+0

'MakeSet'、' FindSet'と 'Link'は' Element.p'と 'Element.rank'にアクセスできる必要があるので、それらを公開しておく必要があります(' DisjointSetForrests')。私は 'internal'と一緒に行くつもりですが、私のライブラリの他のクラスが' Element'のメンバーにもアクセスできないようにしたいと思います。 –

関連する問題