2

クシシュトフの推奨事項はコンストラクターに適用されますか? もしそうなら、どのようにそれを適切に実装しますか?

出力とプロパティには Collection、ReadOnlyCollection、または KeyedCollection を使用し、入力にはインターフェイス IEnumerable、ICollection、IList を使用することをお勧めします。

例えば、

public ClassA
{
    private Collection<String> strings;
    public Collection<String> Strings { get { return strings; } }
    public ClassA(IEnumerable<String> strings)
    {
        this.strings = strings; // this does not compile
        this.strings = strings as Collection<String>; // compiles (and usually runs?)
    }
}
4

7 に答える 7

5

ダウンキャストは避けるべきです。あなたの例では、コンストラクターパラメーターのタイプがメンバーデータのタイプ(つまり、またはのいずれ Collection<String> IEnumerable<String>)と一致する(同じである必要がある)ことをお勧めします。

または、異なる Marc のソリューションがあります。Marc のソリューションは、メンバー データが異なるタイプであるだけでなく、異なるインスタンスでもあることを意味するためです (つまり、メンバー データを変更すると、元のコレクションのコピーが変更されます)。 、元のコレクション自体を編集するのではなく、同様に、コピーを作成した後に元のコレクションが変更された場合、ローカル コピー/メンバー データには、元のコレクションに対するこの後の変更は含まれません)。

于 2009-01-09T15:24:21.737 に答える
4

バージョンを使用しないでasください - のような繰り返し可能なものを受け入れて保存するかIList<T>、データの新しいローカル コレクションを作成する必要があります。

this.strings = new Collection<string>();
foreach(string s in strings) { this.strings.Add(s); }

実際、私はList<T>自分自身を使用します。その後、次のことができます (ただし、これは を使用する理由ではありませんList<T>):

this.strings = new List<string>(strings);
于 2009-01-09T15:24:27.977 に答える
1

可能であれば、ダウンキャストは避けるべきだと思います。クラスが具象クラス「コレクション」として入力を格納する場合(つまり、このクラスは「コレクション」で動作することを意味します)、対応するインターフェースの代わりにタイプ「コレクション」の入力を受け入れる方が自然だと思います。

これにより、ダウンキャスト (必要な場合) の責任が消費者に移されます。

一方、インターフェイスとして入力を受け入れることは、モックオブジェクトをより簡単にフィードする柔軟性を可能にするため、具象クラスよりも優れていると言えます。ただし、これには、具象クラスではなくインターフェイスに依存するクラスの内部が必要になります (したがって、この例では、メンバー変数は Collection ではなく IEnumerable になります)。

私は、Marc のソリューションが入力のコピーを作成することによって実際に使用法を変更したため、責任に変更があるという yapiskan に同意します。

前: 入力はコンシューマとこのクラスの間で常に共有されます。したがって、入力への変更は、コンシューマーとこのクラスの間で「共有」されます

After: このクラスの入力に対する理解は、コンストラクターが呼び出された後にコンシューマーから切り離されます。

于 2009-01-12T03:23:49.380 に答える
0

タイプのパラメーターを受け入れてIEnumerable<String>、検索時にキャストしてみませんか?

public ClassA
{
    private IEnumberable<String> strings;

    public Collection<String> StringCollection {
        get { return (Collection<String>) strings; }
    }

    public ClassA(IEnumerable<String> strings)
    {
        this.strings = strings; 
    }
}
于 2009-01-09T18:20:36.573 に答える
0

保存するものが Collection の場合、ICollection を入力として取得することをお勧めします。

于 2009-01-09T15:26:32.417 に答える
0

これはおそらく、実装をあまり公開しないことがすべてです。理想的には、パブリック API を設計している場合は、実装の最小限のもののみを公開する必要があります。完全な List インターフェースを返すと、パブリック API のユーザーが意図しない方法でクラスの内部をいじる方法がたくさんあります。

- - 編集 - -

于 2009-01-09T15:27:28.467 に答える
0

私はペイジに同意します。

入力として IEnumerable を渡す必要があることに同意します (そのようにして、列挙可能なコレクションをサポートします)。

しかし、StringCollection プロパティを使用して上記で行っていることは、私には意味がありません。ダウンキャストしているため、機能しません。

-マット

于 2009-01-09T18:36:25.810 に答える