を実装するカスタムコレクションを作成したいと思いますICollection
。
ICollection
しかし、私は同じようなClear
方法のいくつかのメンバーを公開したくありません。
これを達成する方法は?
を実装するカスタムコレクションを作成したいと思いますICollection
。
ICollection
しかし、私は同じようなClear
方法のいくつかのメンバーを公開したくありません。
これを達成する方法は?
インターフェイスを明示的に実装し、実装を非表示にすることができます。
public class UrClass : ICollection
{
void ICollection.Clear() { ... }
}
ユーザーはurClassInstance.Clear()
直接呼び出すことはできませんが、((ICollection)urClassInstance).Clear()
このように間接的に呼び出すことはできます。
できません。インターフェイスメンバーは常にパブリックです...そうでない場合、クラスはインターフェイスの実装に失敗します。そのため、インターフェイスメンバーの宣言でアクセス修飾子を使用することはできません。
インターフェイス要件を満たすメンバーを宣言するには、暗黙的および明示的に2つの方法があります。
暗黙的に、署名が一致するパブリックメンバーが使用されます。
public interface IGuess
{
void Guess();
}
public class Guy : IGuess
{
public void Guess() {}
}
これはクラスの「通常の」メンバーであり、タイプのインスタンスに反映されます。
@Jaroslavが指摘しているように、インターフェイス定義を満たすものとしてメンバーを明示的に指定することもできます。
public class Guy : IGuess
{
void IGuess.Guess() {}
}
この場合、インスタンスがインターフェースタイプにキャストされない限り、メンバーは表示されません。まだ公開されています。
ReadOnlyCollectionを調べることをお勧めします。プライベート内部クラスを作成して、それを実装させることができますICollection
。次に、そのオブジェクトReadOnlyCollection
を呼び出して戻るメソッドを作成します。AsReadOnly
または、それがあなたのデザインに合うなら、それをサブクラス化してください。独自の実装を作成するよりも、このコレクションをサブクラス化することをお勧めします。
空にするか、NotImplementedExceptionを起動することができます
ここでは、「継承」よりも「構成」を検討することをお勧めします。
これにより、実際のコレクションとの動的バインディングの利点が追加され、外界に公開するすべてのものをより細かく制御できます。
これらのメンバーを独自のコレクションのインターフェイスから非表示にするだけの場合は、それらを明示的に定義できます。
void ICollection.Clear() {
// ...
}
明示的に定義されたメンバーは、インスタンスがそのインターフェースを介して使用される場合にのみ使用できます。
YourCollection col1 = new YourCollection();
col1.Clear(); // this is not allowed if clear is defined explicitly
ICollection col2 = new YourCollection();
col2.Clear(); // this will work because col2 is ICollection
本当に実装する必要があると確信できる理由は何ICollection
ですか?このインターフェイスの一部のメソッドが必要ない場合は、使用せず、必要なメソッドを使用して新しいインターフェイスを宣言します。使用の全体的なポイントはICollection
、他のオブジェクトが他のコレクションで実行できることは何でも、他のオブジェクトが自分のオブジェクトで実行できると思わせることです。