ユースケース:ジェネリック型のインスタンスを作成するのがなぜこのように機能しますか?
class A {};
class B : A {};
class C : A {};
class Foo <T>: where T : A {
...
// T bar = new T(arg1, arg2);
...
}
class FooB: Foo<B> {...}
class FooC: Foo<C> {...}
私はFoo
の子供を対応してクラスA
の子供を使いたいです。 FooA
とFooB
には、それぞれA
とB
でのみ動作する余分なロジックがあります。参考として、これは正しいシナリオであると感じているので、これを行うには適切な方法だと思うが、他の場所の情報は見ていない。
は、コンパイラはT
が適切であるか、コンストラクタA
の子でなければならないという制約に基づいて、それを見ることはできないでしょうか?私は現在、new()
という制約を追加して、新しく作成されたオブジェクトに対してメソッドを呼び出すことができます。これはまたhere in a similar questionで行われました。私が理解できないことは、コンパイラが未知の型のメソッドを呼び出すことができますが、それをインスタンス化できないことです。特にそうするような制約がある。
、なぜ私はのような何かを行うことができます。
public class A
{
public int SomeInt { get; set; }
public A(int someInt)
{
this.SomeInt = someInt;
}
}
public class B : A
{
}
A
とのパブリックデフォルトコンストラクタがない、ので、これはコンパイルされません。
class Foo <T>: where T: A, new() {
...
T bar = new T()
bar.Construct(arg1, arg2);
...
残念ながら、コンパイラはどのコンストラクタが呼び出される必要があるか分かりません。 –
メソッドがインターフェイスに実装されていることを伝える必要があります。コンパイラが未知の型のメソッドを呼び出すことができる理由は間違っています。タイプが不明ではないためです。インタフェース、クラスには制約があります。コンパイラがジェネリック型のメソッドを呼び出すことができます。 –