DOBON.NETプログラミング道掲示板

■34410 / 親階層)  共変性と反変性ってこういうこと?
□投稿者/ VBはじめました 一般人(25回)-(2019/12/05(Thu) 13:36:59)
  • アイコン環境/言語:[VisualStudio2017 VB.net] 
    分類:[.NET] 

    ジェネリックを勉強していると、共変性と反変性ってでてきます。
    ググればググるほどよくわからなくなるのですが、次ような解釈で問題ないでしょうか?
    詳しい方いらっしゃいましたら教えて頂けないでしょうか?
    
    (以下、自分なりの解釈)
    ジェネリック型は、さまざまなデータ型に対して、同じ機能を実行させるために必要な処理を行うプログラミング機能を提供します。ジェネリック型のメソッドは、呼び出し側が提供するデータ型に合わせてデータ型を指定してインスタンスを作成して使用することになります。その際、完全にデータ型を合致させることが望ましいのですが、場合によってが、融通性を持たせたい場合が発生します。例えば、List<String>型データとArray型のデータに対して同じ機能を実行いたい場合、List<String>型とArray型に対するジェネリック型インスタンスをそれぞれ作って使用すればいいことになります。しかし、ジェネリック型メソッドがデータソースに求める機能が列挙をベースとしたものであれば、IEnumerable<String>型で定義すれば、一つのデリゲート定義でList<String>型とArray型のデータソースが受け取れるという融通性を得ることができます。この際、呼び出し側のデータ型と受け取り側のデータ型が異なるため、データ変換処理が発生します。List<T>クラス、Arrayクラスは、共にIEnumerable<T>を実装していますので、IEnumerable<T>と比べて強い派生型(狭い型)と言えます。即ち、強い派生型から弱い派生型への型変換がなされたということになります。その際に、データとしての互換性がある状況の場合を反変性があると言います。同様な状況は、メソッドからの返り値の受け渡しでも発生し、返り値の場合は、逆に弱い派生型から強い派生型へ変換する必要があり共変性といいます。次の例は、List(Of Integer)型,Array型をIEnumerable(Of Integer)型として受け取り、なんらかの処理をした後、IEnumerable(Of  Integer)型を返し、List(Of  Integer)型、Array型として受け取った。というものです。
    
    (サンプルコード)
       Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
            Dim myList As New List(Of Integer)(New Integer() {1, 2, 3, 4, 5})
            Console.WriteLine("渡したデータ型は、{0}", myList.GetType)
            Dim RetList = Enume(myList)
            Console.WriteLine("返されたデータ型は、{0}", RetList.GetType)
            Console.WriteLine("---------")
            Dim myArray() As Integer = {1, 2, 3, 4, 5}
            Console.WriteLine("渡したデータ型は、{0}", myArray.GetType)
            Dim te2 = Enume(myArray)
            Console.WriteLine("返されたデータ型は、{0}", te2.GetType)
        End Sub
        Function Enume(MyEnume As IEnumerable(Of Integer)) 
                           As IEnumerable(Of Integer)
            Console.WriteLine("受け取ったデータ型は、{0}", MyEnume.GetType)
            '何らかの処理をしたと仮定
            Return MyEnume
        End Function
    
    解釈の内容が正しいのかと、サンプルとして適切かどうか?
    教えて頂けないでしょうか?

マルチポストを報告
違反を報告
削除キー/

前の記事(元になった記事) 次の記事(この記事の返信)
親記事 →Re[1]: 共変性と反変性ってこういうこと? /魔界の仮面弁士
 
上記関連ツリー

Nomalアイコン 共変性と反変性ってこういうこと? / VBはじめました (19/12/05(Thu) 13:36) #34410 ←Now
Nomalアイコン Re[1]: 共変性と反変性ってこういうこと? / 魔界の仮面弁士 (19/12/06(Fri) 11:05) #34411
  └Nomalアイコン Re[2]: 共変性と反変性ってこういうこと? / 魔界の仮面弁士 (19/12/06(Fri) 11:46) #34412
    └Nomalアイコン Re[3]: 共変性と反変性ってこういうこと? / VBはじめました (19/12/06(Fri) 23:46) #34413
      └Nomalアイコン Re[4]: 共変性と反変性ってこういうこと? / VBはじめました (19/12/06(Fri) 23:47) #34414 解決み!

All 上記ツリーを一括表示 / 上記ツリーをトピック表示
 
上記の記事へ返信

Mode/  Pass/


- Child Tree -