10

次の形式はパラメトリック ポリモーフィズムに分類されると読みましたが、実行時ポリモーフィズムまたはコンパイル時ポリモーフィズムのいずれかに分類できますか?

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() 
   {...} 
 }  
4

1 に答える 1

14

それは両方の少しです。ジェネリック クラスを使用するには、コンパイル時に型パラメーターを指定する必要がありますが、型パラメーターはインターフェイスまたは基本クラスの可能性があるため、実行時に使用されるオブジェクトの実際の具象型は異なる場合があります。

たとえば、ここに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());

これは、実行時に利用されるサブタイプ ポリモーフィズムの例です。

于 2012-10-03T12:06:04.967 に答える