3

次のクラス階層があります。

class Header { IEnumerable<Item> Item { get; set; } .... }
class HeaderA : Header { .... } // Item should have the type of IEnumerable<ItemA>
class HeaderB : Header { .... } // Item should have the type of IEnumerable<ItemB>

class Item { .... }
class ItemA : Item { .... }
class ItemB : Item { .... }

の型をコンパイル時にチェックして、ItemそれがIEnumerable<ItemA>IEnumerable<ItemB>for ItemA、およびItemBそれぞれであることを確認することは可能ですか? より良いデザインはありますか?

4

5 に答える 5

6

ヘッダークラ​​スの定義を変更してtypeパラメーターを渡すことができます。次に、次のことを課すことができます。

    class Header<TItem> where TItem : Item { IEnumerable<TItem> Item { get; set; } }
    class HeaderA : Header<ItemA> { } // Item should have the type of IEnumerable<ItemA>
    class HeaderB : Header<ItemB> { } // Item should have the type of IEnumerable<ItemB>

    class Item { }
    class ItemA : Item { }
    class ItemB : Item { }
于 2012-09-13T16:41:50.643 に答える
2

ジェネリッククラスを使用する必要があります

于 2012-09-13T16:40:19.117 に答える
2

ジェネリック型を使用してクラスに渡すことができます。

public class Header<T> where T : Item
{
   IEnumerable<T> Item { get; set; }
}


 Header<ItemA> AHeader;
 Header<ItemB> BHeader;

http://msdn.microsoft.com/en-US/library/sz6zd40f(v=vs.100 )

于 2012-09-13T16:44:12.283 に答える
1

このような

class HeaderA : Header<ItemB> { .... }
class HeaderB : Header<ItemA> { .... }
于 2012-09-13T16:43:11.723 に答える
0

あなたの質問を正しく理解できれば、Header クラスのシグネチャを変更してこれを実現できます。

class Header<ItemType> { IEnumerable<ItemType> Item {get; set;} ....}
class HeaderA : Header<ItemA> { .... }
class HeaderB : Header<ItemB> { .... }

class Item { .... }
class ItemA : Item { .... }
class ItemB : Item { .... }

HeaderA は ItemA オブジェクトのみを許可し、HeaderB は ItemB オブジェクトのみをそれぞれの Item コレクションに入れることを許可します。

于 2012-09-13T16:45:41.807 に答える