2012-10-03 3 views
7

다음 형식이 매개 변수 다형성에 있다고 읽었지만 런타임 또는 다형성 다형성 중 하나로 분류 할 수 있습니까?제네릭 런타임 또는 컴파일 타임 다형성이 있습니까?

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

두 가지 모두 조금 있습니다. 제네릭 클래스를 사용하려면 컴파일 타임에 유형 매개 변수를 제공해야하지만 type 매개 변수는 인터페이스 또는 기본 클래스 일 수 있으므로 런타임에 사용되는 실제 구체적인 유형의 객체가 다를 수 있습니다.

예를 들어 여기에 Stack<T> 필드가있는 코드 스 니펫이 있습니다. 인터페이스를 type 매개 변수로 사용하기로했습니다. 컴파일시에 parametric polymorphism을 사용합니다. 내가 누구의 클래스 IFoo를 구현하는 객체를 사용할 수

이제
public interface IFoo { void Foo(); } 

public Stack<IFoo> _stack = new Stack<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

참조 자료를 제공해 줄 수 있습니까? –

관련 문제