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

■34351 / 1階層)  ジェネリック型インターフェースを使った変数を扱いたい
□投稿者/ 魔界の仮面弁士 大御所(1246回)-(2019/11/01(Fri) 16:13:16)
  • アイコンNo34349に返信(アフロさんの記事)
    > public interface IRoutine<TParent> : IRoutine
    >     where T : IRoutine
    > {
    >   // 親を設定する
    >   T Parent { get; set; }
    > }

    このインターフェイスは、<T> を持つジェネリック クラスの
    子階層で定義されているということでしょうか?
    それともこれは誤記で、実際は T = TParent なのでしょうか?


    > ClassA : IRoutine<ClassA>
    これは「class ClassA : IRoutine<ClassA>」のことでしょうか?


    > var routines = new IRoutine<T>[] {ClassA, ClassB}; // ※

    元ソースが文法的に不正確である点はさておき、
     var t0 = typeof(IRoutine);
     var t1 = typeof(IRoutine<>);
     var t2 = typeof(IRoutine<ClassA>);
     var t3 = typeof(ClassA);
    において、
     t0.IsAssignableFrom(*) は、t0〜t3 いずれに対しても true
     t1.IsAssignableFrom(*) は、t1 自身以外はすべて false
     t2.IsAssignableFrom(*) は、t0〜t1 は false、t2 自身と t3 は true
     t3.IsAssignableFrom(*) は、t3 自身以外はすべて false
    という関係性を持ちます。


    ゆえに今回の型定義の場合、書くとしても
     var routines = new IRoutine[] { new ClassA(), new ClassB() };
     foreach (dynamic routine in routines)
     {
       routine.Parent = afro;
     }
    とするしかないでしょう。


    ただしこの場合、公開された
     class ClassA : IRoutine<ClassA>
     {
       public ClassA Parent { set; get; }
     }
    のような実装が対象であり、明示実装された
     class ClassA : IRoutine<ClassA>
     {
       ClassA IRoutine<ClassA>.Parent { set; get; }
     }
    なクラスに対しては使えません。
違反を報告
削除キー/

前の記事(元になった記事) 次の記事(この記事の返信)
←ジェネリック型インターフェースを使った変数を扱いたい /アフロ →Re[2]: ジェネリック型インターフェースを使った変数を扱いたい /アフロ
 
上記関連ツリー

Nomalアイコン ジェネリック型インターフェースを使った変数を扱いたい / アフロ (19/11/01(Fri) 11:51) #34349
Nomalアイコン ジェネリック型インターフェースを使った変数を扱いたい / 魔界の仮面弁士 (19/11/01(Fri) 16:13) #34351 ←Now
  └Nomalアイコン Re[2]: ジェネリック型インターフェースを使った変数を扱いたい / アフロ (19/11/01(Fri) 17:47) #34352 解決み!
    └Nomalアイコン Re[3]: ジェネリック型インターフェースを使った変数を扱いたい / 魔界の仮面弁士 (19/11/01(Fri) 18:37) #34353 解決み!

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

Mode/  Pass/


- Child Tree -