それは両方の少しです。ジェネリック クラスを使用するには、コンパイル時に型パラメーターを指定する必要がありますが、型パラメーターはインターフェイスまたは基本クラスの可能性があるため、実行時に使用されるオブジェクトの実際の具象型は異なる場合があります。
たとえば、ここにStack<T>
フィールドを含むコードのスニペットがあります。型パラメーターとしてインターフェイスを使用することにしました。これは、コンパイル時にパラメトリック ポリモーフィズムを利用します。_stack
コンパイル時にフィールドが使用する型パラメーターを選択する必要があります。
public interface IFoo { void Foo(); }
public Stack<IFoo> _stack = new Stack<IFoo>();
さて、このコード スニペットが実際に実行されるIFoo
と、クラスが を実装する任意のオブジェクトを使用できます。その決定は、実行時まで行う必要はありません。
public class Foo1 : IFoo { public void Foo() { Console.WriteLine("Foo1"); } }
public class Foo2 : IFoo { public void Foo() { Console.WriteLine("Foo2"); } }
public class Foo3 : IFoo { public void Foo() { Console.WriteLine("Foo2"); } }
_stack.Push(new Foo1());
_stack.Push(new Foo2());
_stack.Push(new Foo3());
これは、実行時に利用されるサブタイプ ポリモーフィズムの例です。