2

抽象ジェネリック コレクション クラスの派生インスタンスを作成するファクトリ メソッドを作成しようとしています。ここに基本クラスがあります...

abstract class ItemBase { }

abstract class CollectionBase<T> : Collection<T> where T : ItemBase, new() { }

...およびその派生クラス ...

class Item : ItemBase { }

class ItemCollection : CollectionBase<Item> {}

ここで、ItemCollection を作成するファクトリ メソッドが必要です。ただし、派生クラス Item および ItemCollection は、このファクトリ メソッドを含むクラスには認識されないことに注意してください。これは私がそれがあるべきだと私が想像する方法です...

static T CreateItemCollection<T>() where T : CollectionBase<ItemBase>, new()
{
    return new T();
}

...そして、私はそれをこのように呼び出すことを想像します...

var collection = CreateItemCollection<ItemCollection>();

ただし、ItemBase にはパラメーターのないコンストラクターが必要なため、ファクトリ メソッドはコンパイルされません。そして、呼び出しは、ItemCollectionが から派生したものであると信じることを拒否しますCollectionBase<ItemBase>

誰かが私を正しい方向に向けることができますか? ありがとう。

4

2 に答える 2

6

ItemCollection CollectionBase<ItemBase>一般的な不変性のため、はから派生していません。結局のところ、 を - に追加することはできますが、ItemBaseそれCollectionBase<ItemBase>ItemCollection!

メソッドを 2 つの型パラメーターでジェネリックにする必要があります。

static T CreateItemCollection<TCollection, TItem>()
    where TCollection : CollectionBase<TItem>, new()
    where TItem : ItemBase
{
    return new TCollection();
}

パラメーターなしのコンストラクターが必要なのはコレクション型だけです。これを次のように呼び出します。

var collection = CreateItemCollection<ItemCollection, Item>();
于 2009-09-08T15:17:37.063 に答える
3

ここでの問題は、C# 3.0 の一般的な制約であり、分散に関して余裕があります。代わりに、マッチングはかなり厳密です。ItemCollection はから派生しているため、型に互換性があるように見えCollectionBase<Item>ても、派生しているとは見なされません。CollectionBase<ItemBase>

于 2009-09-08T15:18:22.177 に答える