2016-10-25 4 views
1

ジェネリッククラスMyClass<T>を作成するたびに、MyClass<>というインターフェイスが自動的に生成され、汎用のパラメータまたは戻り値を使用しないすべてのメソッドとプロパティMyClass<T>があるとします。任意のT型の汎用クラスを保持できる変数型に根本的な欠陥がありますか?

これは、別のTタイプの汎用オブジェクトを処理できるようにするために、単なるインタフェースを作成することから私を救うでしょう。このアイデアに根本的な問題があるのは、それが言語の一部ではない理由であるか、「それは優先されていないか重要であると考えられている」というケースだけですか?

私が「インターフェース」と言うとき、これは必然的に「インターフェース」と呼ばれ、「インターフェース」と呼ばれることを意味しません。私の言うことを説明するのは簡単な方法でした。一種の抽象基本クラスは、それを考えるもう一つの方法です。この機能が存在する場合、その機能は生成されているとは考えられません。タイプList<>の変数はもちろんList<int>またはList<MyElement>のような汎用リストを保持することができ、CountClear()Capacityなどのようなものを呼び出すことができます。Tのタイプの知識は必要ないためです。

このディスカッションスレッドが、明確な答えを持つ問題ではない、なぜちょうどそれを明確にする:

私の質問は、レンダリングするアイデア自体に欠陥があるのか​​どうか、それ型の安全性と互換性がありませんか、またはそれに根本的な欠陥がないかどうかを判断する。使い方の

例:

私は、ジェネリック型に依存していくつかのデータとそうでない他のいくつかのデータの両方が含まれている一般的なクラスを持っています。そして、データの非ジェネリック部分を操作できる再利用可能なコードがあります。現在、私はジェネリッククラスと同じメンバ(汎用のパラメータまたは戻り値を使用するメンバを除いたもの)を持つインターフェイスを定義することによってのみこれを行うことができます。私が複数の実装を持つつもりがない場合、このインタフェースを定義することは余計なようです。必要な情報がすでにジェネリッククラスそのものに入っているため、余分なインターフェースを指定せずに同じことができる言語機能は、この場合には便利です。

単純なケースでは、ジェネリッククラスに対する非ジェネリックベースクラスを持つことが一般的なアプローチです。ただしMyClass<T>が既にMyBaseClass<T>から継承されている場合、間に非ジェネリッククラスを置くことはできず、インターフェイスのみを使用できます。

+4

私はあなたの質問を3回読みましたが、私はまだあなたが何を求めているのか全く分かりません。 –

+0

私は同意します、あなたは何を求めていますか? –

+0

私はそのような機能が概念的にC#に追加するのが妥当かどうか、あるいはそのような言語機能をC#に追加することはできないというアイデアに根本的な欠陥があるかどうかを尋ねています。 – runevision

答えて

2

私の質問は、タイプセーフティなどと互換性がないというアイデア自体に欠陥があるかどうか、または基本的な欠陥がないかどうかです。

いいえ、手動で基本クラス/インタフェースを手動で作成できると考えても、言語が自動的に作成できない理由はありません。

しかし、.Netでこのような言語を構築した場合、それは既に開いているジェネリック型を表すためにMyClass<>と呼ばれていない可能性があります(typeof(MyClass<>)は有効な式になります)。 )。

+0

自然なフォローアップの質問は、「なぜオープンなジェネリック型の変数を宣言できないのですか? – Superpig

+0

@ Superpigこのような変数にはオブジェクトを割り当てることができなかったためです。 「閉じたジェネリック型を持つオブジェクトが、その型が対応する開いたジェネリック型の変数に割り当てられないのはなぜですか?」と尋ねると、それは疑う余地のない有用性があると考えられます。 – svick

+0

@svickそれは私が気づいていた機能です。開いたジェネリック型は現在、変数型の目的では言語で使用されていないので、閉じたジェネリックオブジェクトをオープンジェネリック型の変数に割り当てることができれば、矛盾してはいけません。オープンジェネリック型は、インタフェースがあまり制限的でないように、オブジェクトよりも制限が少ない。私がオープンジェネリック型を最初に学んだとき、私はあなたがこれを行うことができると思っていました。 – runevision

関連する問題