2010-12-06 38 views
33

私はキューのようなインターフェイスで動作するオブジェクトを書きたいと思っていました。私はIQueue<T>を探しに行ったが、驚くほど空手に戻った。IQueue <T>またはIStack <T>インターフェイスが.NET Frameworkに存在しないのはなぜですか?

次のコレクション関連のインターフェイスがあります。

  • ICollection<T>
  • IList<T>
  • IDictionary<TKey,TValue>
  • ISet<T>

コレクションのこれらのタイプは、明確に定義されたインタフェースを取得作っ何?なぜスタックやキューはインターフェイスを保証しないのですか?

+4

スタックまたはキューは、ソートされたリストの実装は非常に簡単なので、2行のコードのようなものでビルドすると、なぜ1になるのでしょうか? –

+1

@Russell Steenキュー内で*ソートされたものは何ですか?リンクされたリストはありますか? – Andrey

+5

@Russell Steen実装の詳細は、明確に定義された*インタフェース*を持つ要素であってはなりません。 –

答えて

13

これらのインターフェイスからそれらを実装するクラス(最新のConcurrentQueueを除く)への1対1のマッピングがあるからです。しかし、他の言及されたインターフェイスは、それらを実装する多くのクラスを持っています。

ビットを拡張しています。私たちはBCLチームの本当の動機を知ることができません。しかし、私は彼らがQueueStackを作成したときにそれらのクラスがとても控えめに見えるので、それらをインターフェイスに抽象化しないことにしたという気持ちがあります。理由は明白です:クラスは非常にシンプルですが、同時に完了しているので、BCLで異なるクラスを実装する理由はありません。その後、ConcurrentQueueが来て、それ以前の声明はやや間違っていた。

QueueConcurrentQueueには、単一のインターフェイスを実装するほど類似していないと指摘しています。

+0

なぜこれがダウンリストされましたか? – Andrey

+0

+1対話の下降。私は答えが少し拡大したが、私はそれが-1に値するとは思わないと思う。 –

+1

@Paul Sasikのおかげで、私は拡大し、 – Andrey

2

StackとQueueは非常に特殊な概念なので、私の知る限り、スタックやキューの特別な形式を実装する他のクラスはありません。

EDIT:

[OK]を、今、私の結論を否定するようでConcurrentQueue<T>、そこにあります。たぶん、C#1.0がまだベータ版の時代になって、言語設計者はキュー/スタックの特別な形になることはないだろうと思っていました。

これは多くの推測です。私は、Eric Lippertがこの質問を見て「公式な」声明を発表することを願っています。 :-)

+0

質問は一般化であって特化ではありませんでした – Andrey

+0

@Andrey:私が言いたいのは、キューの概念はQueueクラスによって完全にカバーされているため、インタフェースとキューの別の実装は必要ないかもしれないということです。スタックと同じです。 – VVS

+0

@VVS:あなたの編集について... MSが 'SortedSet 'を.NET4に導入したとき、 'ISet 'インターフェースを紹介し、 'HashSet 'にレトロフィットすることを止めませんでした。 – LukeH

4

スタックやキューインターフェイスがコレクションの性質のために表示されないと思います。インターフェイスを持つコレクションインターフェイスはランダムアクセスで、スタックとキューはランダムアクセスです。非常に特殊な方法(FIFOまたはLIFO)でアクセスする必要があるため、一般的に使用することはできません。だから、それらのコレクションを汎用的な実装として使うのではなく、インターフェースを使うのではないでしょうか。言い換えれば、LIFO/FIFOがコレクション上に置かれるという制約のため、理論上のIStackまたはIQueueを実装したクラスによって異なる方法で行うことはほとんど、あるいはまったくありません。

独自のIStackやIQueueを作成してクラスに実装することができます。公開する機能が完全にパススルーされることがわかります。例えば。要求や結果を内部のスタックまたはキューコレクションに転送または返すだけで終わります。そのパススルー機能には、潜在的な付加価値がほとんどまたはまったくありません。

+3

'ConcurrentQueue '(実際にはBCLに存在します)のようなものはどうですか?あなたはそれが共通のインターフェースを実装の両方に 'キュー'と 'ConcurrentQueue 'のために理にかなっているだろうと思いませんか? – LukeH

+0

@ LukeH:これはまだFIFOのセマンティクスに従っていますが、それはより専門的なコレクションです。だからiConcurrentQueueインターフェイスが役に立つとは思えません。 –

+3

私は実際に 'IQueue 'インターフェイスを作成しています!私の実装は、ディスクに保存されている同期ストアを使用します。私自身のことを定義するのではなく、既存のインターフェースを再利用することが望ましいでしょう! –

3

なぜする必要があります .NETフレームワークはIQueue<T>IStack<T>インターフェイスを持っていますか?彼らは何を買うだろうか?

これらの種類のコレクションを作成した理由 は、明確に定義されたインターフェイスを取得しましたか?

ザ基本クラスライブラリは、実際にはそれらのインタフェース(IListなど)のすべてを使用する:それぞれの場合において、それは具体的なタイプよりもインタフェースの抽象化と対話するために、より理にかなっている他のクラスの束があります。

なぜスタックとキューは、インターフェイスに を保証しませんか?おそらく

IStack<T>IQueue<T>を必要なBCLのクラスが存在しませんでしたし、それらの抽象化のための明らかなまたは可能性の高いユースケースはなかったので。

これは満足のいく哲学的な答えではありませんが、フレームワークデザイナーが実際にインターフェイスを持っていることについて実用的だったように見えます。

+0

実用的な側面は考慮すべき良いものです。私はすぐに使用することができなかったインターフェースを作成することは確かではありません。 –

+0

これはおそらく "真の"答えです。私はデザイナーが必要とするまで、含まれているインターフェイスの多くを作成していないと思います。 –

0

何か特別な理由があったのでしょうか?私がドリュータを持っていれば、それらを単独で実装したクラスがなくても、はるかに離散的に定義されたインターフェースが存在するでしょう。たとえば、IGetNext(Of T)、IGetNextWait(Of T)、およびIClear(Of T)をIQueue(Of T)、IWaitQueue(Of T)などと一緒に実装するQueueStack(Of T) IStack(Of T)、およびIWaitStack(Of T)。オブジェクトを消費する人は、実際に必要なものを狭く指定することができ、実装者はサポートすると主張するものを実装するだけで済みます。

2

私は、.NET 4 ConcurrentQueue<T>ConcurrentStack<T>における新しいクラスの存在そのものがIQueue<T>IStack<T>インタフェースが行われている必要があることをあなたのポイントを証明していると思います。元々存在していなかったとしても、.NET 4に追加されているはずです。

これまで.NETで独自のカスタムStack実装を作成しておかなければならず、 。

関連する問題