11

を実装するカスタムコレクションを作成したいと思いますICollection

ICollectionしかし、私は同じようなClear方法のいくつかのメンバーを公開したくありません。

これを達成する方法は?

4

7 に答える 7

25

インターフェイスを明示的に実装し、実装を非表示にすることができます。

public class UrClass : ICollection
{
    void ICollection.Clear() { ... }
}

ユーザーはurClassInstance.Clear()直接呼び出すことはできませんが、((ICollection)urClassInstance).Clear()このように間接的に呼び出すことはできます。

于 2011-03-12T19:15:47.203 に答える
1

できません。インターフェイスメンバーは常にパブリックです...そうでない場合、クラスはインターフェイスの実装に失敗します。そのため、インターフェイスメンバーの宣言でアクセス修飾子を使用することはできません。

インターフェイス要件を満たすメンバーを宣言するには、暗黙的および明示的に2つの方法があります。

暗黙的に、署名が一致するパブリックメンバーが使用されます。

public interface IGuess
{
    void Guess();
}

public class Guy : IGuess
{
    public void Guess() {}
}

これはクラスの「通常の」メンバーであり、タイプのインスタンスに反映されます。

@Jaroslavが指摘しているように、インターフェイス定義を満たすものとしてメンバーを明示的に指定することもできます。

public class Guy : IGuess
{
    void IGuess.Guess() {}
}

この場合、インスタンスがインターフェースタイプにキャストされない限り、メンバーは表示されません。まだ公開されています。

于 2011-03-12T19:10:27.663 に答える
1

ReadOnlyCollectionを調べることをお勧めします。プライベート内部クラスを作成して、それを実装させることができますICollection。次に、そのオブジェクトReadOnlyCollectionを呼び出して戻るメソッドを作成します。AsReadOnlyまたは、それがあなたのデザインに合うなら、それをサブクラス化してください。独自の実装を作成するよりも、このコレクションをサブクラス化することをお勧めします。

于 2011-03-12T19:12:19.057 に答える
1

空にするか、NotImplementedExceptionを起動することができます

于 2011-03-12T19:15:01.223 に答える
1

ここでは、「継承」よりも「構成」を検討することをお勧めします。

これにより、実際のコレクションとの動的バインディングの利点が追加され、外界に公開するすべてのものをより細かく制御できます。

于 2011-03-12T20:25:25.093 に答える
0

これらのメンバーを独自のコレクションのインターフェイスから非表示にするだけの場合は、それらを明示的に定義できます。

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
于 2011-03-12T19:21:45.470 に答える
0

本当に実装する必要があると確信できる理由は何ICollectionですか?このインターフェイスの一部のメソッドが必要ない場合は、使用せず、必要なメソッドを使用して新しいインターフェイスを宣言します。使用の全体的なポイントはICollection、他のオブジェクトが他のコレクションで実行できることは何でも、他のオブジェクトが自分のオブジェクトで実行できると思わせることです。

于 2011-03-12T19:25:12.450 に答える