BT

最新技術を追い求めるデベロッパのための情報コミュニティ

寄稿

Topics

地域を選ぶ

InfoQ ホームページ ニュース .NET汎用における共変性と反変性

.NET汎用における共変性と反変性

現在VBや#Cのような.NET言語は、属性の共変性と反変性をサポートしていない。これは、近い将来変わるとは考えにくいが、Microsoftでは、 それについて話している。共変性と反変性を完璧に紹介するには、余りにも長い時間がかかるであろう。そのため、Eric Lippert氏のシリーズであるCovariance and Contravariance in C#(リンク)を参考にすることを勧めている。

VBにおける共変性と反変性の属性タイプ(リンク)のサポートを追加するには、Lucian Wischik氏は以下の構文に従うことを提案している。

型パラメータは、キーワード「In」や「Out」で修飾することができる。「In」はメソッドパラメータとしてのみ、表示される型である。同様に、「Out」はメソッドの戻りの型としてのみ表示される型である。

Out型が便利な例は、IEnumerable(Of T)である。機能がIEnumerable(Of Animal)を要求している場合、IEnumerable(of Bird)はどんな状況下においても機能する。In型については、やや考案された例が望ましい。以下のインターフェイスを検討してみる。

Interface IWriter(Of T)     Write(value As T)

IWriter(Of Animal)を要求している機能にIWriter(Of Bird)を渡す場合、明らかに機能しない。メソッドはAnimalのすべてのサブクラスをIWriter.Writeに渡すが、Birdsのみがサポートされる。

注釈付きでは、インターフェイスは以下のようになる。

Interface IEnumerable(Of Out T) 
Interface IWriter(Of In T)

これはVB向けに提案されたが、C#でも使用可能である。

interface IEnumerable 
interface IWriter

残念ながら、この構文は最も一般的なシナリオでは直接機能しない。IList(Of T)を検討するのがよい。コレクションに書き込むメソッドに渡す場合、TがIn型である。コレクションから書き込むメソッドに渡す場合、Out型である。 ここでのソリューションは、IList向けのベースクラスをレトロスペクティブに作成し、T値を受け入れるメソッドとT値を返すメソッドを区別する。

歴史的な注記としては、反変性(in/IWriterシナリオ)でランタイムエラーにつながる可能性があったとしても、C#およびVB は配列の共変性(out/IEnumerable scenario)をサポートする。C#をJavaと互換性をさらに持たせる目的であった。一般的に、これは哀れな決断だと見なされているが、今回は取り 消すことができない。

原文はこちらです:http://www.infoq.com/news/2008/08/GenericVariance

この記事に星をつける

おすすめ度
スタイル

BT