1

以下のように記述された c# asp.net ソース コードを見ました。

public class EntityInstanceContext<TEntityType> : EntityInstanceContext
{
    /// <summary>
    /// Initializes a new instance of the <see cref="EntityInstanceContext{TEntityType}"/> class.
    /// </summary>
    public EntityInstanceContext()
        : base()
    {
    }

ジェネリック型が非ジェネリック型からサブクラス化されている理由を理解するのを手伝ってくれる人はいますか? そして、そのように設計することの利点は何ですか?

4

1 に答える 1

2

.NET TypeSystem は非常に強力です。次のシナリオを想像してください。私はMyTuple、BCLTupleクラスの不十分にコーディングされたクローンであるという名前のクラスを作成しています。

public class MyTuple<T1, T2> {
    public T1 Item1 { get; private set; }
    public T2 Item2 { get; private set; }

    public MyTuple(T1 item1, T2 item2) {
        this.Item1 = item1;
        this.Item2 = item2;
    }
}

そして、その型のファクトリのようなメソッドT1を作成して、指定せずに型推論システムに正常にフックできるようにしたいことに気付きましT2た。

new MyTuple<int, string>(123, "test"); // which is also a bit redundant

だから私はクラスで話していたメソッドを書いています。クラスを呼び出しましょうFactory

public class Factory {

    public static MyTuple<T1, T2> Create<T1, T2>(T1 item1, T2 item2) {
        return new MyTuple<T1, T2>(item1, item2);
    }

}

そうすれば、書くときはもっと幸せです:

var tuple = Factory.Create(123, "test"); // and tuple is inferred to be of <int, string>

Factoryに名前を変更するとどうなりますかMyTuple

public class MyTuple {

    public static MyTuple<T1, T2> Create<T1, T2>(T1 item1, T2 item2) {
        return new MyTuple<T1, T2>(item1, item2);
    }

}

要するに:何も悪いことはありません

2 つの完全に異なるタイプがあるのは、単純なケースです。

  • MyTuple (非ジェネリック)
  • マイタプル < T1, T2 >

共通点はなく、タイプが異なります。

MyTuple<T1, T2>そして、たまたま延長したと言っていいMyTupleですか?MyTupleまあ、どちらstaticでもない限りsealedええ、確かに

public class MyTuple { ... }
public class MyTuple<T1, T2> : MyTuple { ... }

したがって、あなたの場合、それはMammal拡張Animalまたは...Tiger拡張に他なりませんMammalMammal of a weirder sort延長するようなものではありませんMammal of a good ol' classical sort

于 2013-09-18T11:14:12.767 に答える