2012-10-03 12 views
7

मैंने पढ़ा है कि निम्न प्रारूप पैरामीट्रिक बहुरूपता के अंतर्गत आता है, लेकिन क्या हम इसे एक या तो रनटाइम या संकलित समय polymorphism में वर्गीकृत कर सकते हैं?जेनिक्स रनटाइम या संकलन समय polymorphism है?

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

@ गुइलाउम ग्रेट, संक्षिप्त लेख मैं ईएल द्वारा कुछ खोज रहा था संदर्भ के रूप में। – FishBasketGordo

उत्तर

9

यह दोनों का थोड़ा सा है। एक सामान्य वर्ग का उपयोग करने के लिए, आपको संकलन समय पर इसे एक प्रकार पैरामीटर देना होगा, लेकिन टाइप पैरामीटर इंटरफ़ेस या बेस क्लास का हो सकता है, इसलिए रनटाइम पर उपयोग की जाने वाली ऑब्जेक्ट्स का वास्तविक, ठोस प्रकार भिन्न हो सकता है।

उदाहरण के लिए, यहां मेरे पास Stack<T> फ़ील्ड के साथ कोड का एक स्निपेट है। मैंने टाइप पैरामीटर के रूप में इंटरफ़ेस का उपयोग करना चुना है। यह संकलन समय पर parametric polymorphism का उपयोग करता है। आप का चयन करना होगा जो प्रकार पैरामीटर अपने _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()); 

यह subtype polymorphism, जो रन टाइम पर उपयोग किया जाता है का एक उदाहरण है।

+1

क्या आप कोई संदर्भ दे सकते हैं? –