2

中間層には、親のものに属する子のもののコレクション用の便利なコレクションがあります。

public class ChildCollection<TParent, TChild>
{
    public IEnumerable<TChild> GetChildren();
    etc.
}

インターフェイスには、ChildCollection <TParent、TChild>のコンテンツを表示し、ユーザーが作業できるようにする便利なグリッドがあります。

public abstract class ChildCollectionGrid<TCollection, TParent, TChild> : MyGridControl
    where TCollection : ChildCollection<TParent, TChild>
{
    public abstract TCollection Collection;
    etc.
}

このクラスを継承して、ウィジェット上のワッフルと連携するグリッドを作成すると、次のようになります。

public class WidgetWafflesGrid : ChildCollectionGrid<WidgetWafflesCollection, Widget, Waffle>

これは少し冗長です。WidgetWaffleCollection、ChildCollection <Widget、Waffle>です。最初のジェネリック型引数を指定すると、他の2つを正確に指定しない限り、クラスはコンパイルされません。

コンパイラがこれらの他の2つのタイプを推測できる、これを達成するためのより良い方法はありますか?私は気難しいことを知っていますが、理想的にはクラス宣言を次のようにしたいと思います。

public class WidgetWafflesGrid : ChildCollectionGrid<WidgetWafflesCollection>

ご協力いただきありがとうございます!

4

3 に答える 3

2

いいえ、ありません。ジェネリックパラメーターの推論は、メソッドでのみ機能します。

于 2012-08-01T19:33:33.513 に答える
1

なぜあなたのコレクションから派生するのですか?次のようにしてください:

public abstract class ChildCollectionGrid<TParent, TChild> : MyGridControl
{
    public abstract ChildCollection<TParent, TChild> Collection;
    etc.
}

public class WidgetWafflesGrid : ChildCollectionGrid<Widget, Waffle>
{  
}
于 2012-08-01T19:44:51.980 に答える
1

Genericsを使用してコレクションの継承を処理する唯一の方法は、Collection<TCollection,TChild> : where TCollection : Collection<TCollection,TChild> { }パターンを使用することです。

これは具体的なクラスの例です

public abstract class Collection<TCollection, TChild>
    where TCollection : Collection<TCollection, TChild>, new()
{
    protected Collection()
    {
        List=new List<TChild>();
    }
    protected List<TChild> List { get; set; }

    public TCollection Where(Func<TChild, bool> predicate)
    {
        var result=new TCollection();
        result.List.AddRange(List.Where(predicate));
        return result;
    }

    public void Add(TChild item) { List.Add(item); }
    public void AddRange(IEnumerable<TChild> collection) { List.AddRange(collection); }
}

public class Waffle
{
    public double Temperature { get; set; }
}

public class WafflesCollection : Collection<WafflesCollection, Waffle>
{
    public WafflesCollection BurnedWaffles
    {
        get
        {
            return Where((w) => w.Temperature>108);
        }
    }
}

class Program
{
    static void Main(string[] args)
    {
        WafflesCollection waffles=new WafflesCollection();

        // Count = 3
        waffles.Add(new Waffle() { Temperature=100 });
        waffles.Add(new Waffle() { Temperature=120 });
        waffles.Add(new Waffle() { Temperature=105 });

        var burned=waffles.BurnedWaffles;
        // Count = 1
    }
}
于 2012-08-02T15:33:45.607 に答える