2012-10-03 8 views
7

以下の形式はパラメトリック多形性の下にありますが、実行時またはコンパイル時の多態性のいずれかでそれを分類できますか?Genericsランタイムまたはコンパイル時の多型はありますか?

public class Stack<T> 
{ // items are of type T, which is known when we create the object 
    T[] items; 
    int count; 
    public void Push(T item) {...} 
    //type of method pop will be decided when we create the object 
    public T Pop() 
    {...} 
} 
+3

この記事を参照してください。http://blogs.msdn.com/b/ericlippert/archive/2009/07/30/generics-are-not-templates.aspx – Guillaume

+0

@Guillaume素晴らしい、短い記事。私はE.L.で何かを探していました。参考として – FishBasketGordo

答えて

9

これは少しです。ジェネリッククラスを使用するには、コンパイル時に型パラメータを渡さなければなりませんが、型パラメータはインタフェースクラスまたは基本クラスであるため、実行時に使用される実際の具体的なオブジェクト型は異なります。

たとえば、ここにコードのスニペットがStack<T>フィールドあります。私は型パラメーターとしてインターフェイスを使用することを選択しました。これはコンパイル時にparametric polymorphismを使用します。

public interface IFoo { void Foo(); } 

public Stack<IFoo> _stack = new Stack<IFoo>(); 

、このコードのスニペットは、実際に私はそのクラスIFooを実装する任意のオブジェクトを使用することができ、実行され、その決定は持っていないとき:あなたの_stackフィールドがコンパイル時に使用するどのタイプのパラメータを選択する必要があります実行時まで行われる。

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()); 

これは、実行時に利用されるsubtype polymorphism、一例です。

+1

参考資料はありますか? –

関連する問題