.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
拡張に他なりませんMammal
。Mammal of a weirder sort
延長するようなものではありませんMammal of a good ol' classical sort
。