2015-06-18 5 views
7

जहाँ तक मुझे पता है, इंटरफेस को तत्काल नहीं किया जा सकता है।इंटरफ़ेस परिवर्तनीय तत्कालता क्यों संभव है?

यदि यह सत्य है, तो निम्न कोड संकलित और निष्पादित क्यों करता है? यह आपको एक परिवर्तनीय इंटरफ़ेस बनाने की अनुमति देता है। यह क्यों संभव है?

इंटरफ़ेस:

public interface IDynamicCode<out TCodeOut> 
{   
    object DynamicClassInstance { get; set; } 
    TCodeOut Execute(string value = ""); 
} 

INCODE:

var x = new IDynamicCode<string>[10]; 

परिणाम:

Result

अद्यतन:

यह तब होता है जब सरणी घोषित की जाती है। एक भी उदाहरण नहीं है।

+7

आप एक सरणी बनाया। –

उत्तर

16

आप इंटरफ़ेस को तुरंत चालू नहीं कर रहे हैं, लेकिन उस इंटरफ़ेस की एक सरणी।

आप उस श्रेणी में IDynamicCode<string> लागू करने वाले किसी भी वर्ग का एक उदाहरण असाइन कर सकते हैं। आप public class Foo : IDynamicCode<string> { } है कहते हैं, आप उस दृष्टांत और उस सरणी का एक तत्व को असाइन कर सकें:

var x = new IDynamicCode<string>[10]; 
x[5] = new Foo(); 

इंटरफ़ेस instantiating संकलन नहीं होगा:

var bar = new IDynamicCode<string>(); 
13

आप इंटरफ़ेस का उदाहरण बनाकर नहीं कर रहे हैं ; आप एक सरणी बना रहे हैं जो IDynamicCode के अनुरूप कई वस्तुओं को पकड़ सकता है। प्रारंभ में, प्रविष्टियों का उनका डिफ़ॉल्ट मान होता है, जो null है।

6
इस

एक अंतरफलक चर

इस एक सरणी प्रत्येक तत्व का इंटरफ़ेस लागू करता है पैदा करेगा नहीं बना रहा है। यदि आप x[0] = new IDynamicCode<string>(); लिखते हैं तो आपको त्रुटि मिल जाएगी। सभी तत्वों का null हैं, तो आप प्रत्येक तत्व एक वस्तु जो लागू करता IDynamicCode

3

सौंपने होंगे जब आप

var x = new IDynamicCode<string>[10]; 

फोन कंस्ट्रक्टर्स कहा जाता है नहीं कर रहे हैं। उन्हें केवल घोषित किया जाता है।

5

बस एक दिलचस्प अतिरिक्त नोट:

जबकि धारणात्मक संभव नहीं, वाक्य रचना यह वास्तव में संभव विशेष परिस्थितियों में एक अंतरफलक का दृष्टांत है।

.NET को CoClassAttribute कहा जाता है जो निर्दिष्ट इंटरफ़ेस को निर्दिष्ट ठोस प्रकार के रूप में समझने के लिए संकलक को बताता है।

var x = new IDynamicCode<string>(); 

ऐसी विशेषता का एक विशिष्ट घोषणा इस प्रकार दिखाई देगा: निम्नलिखित कोड पूरी तरह से वैध बनाने के लिए और नहीं एक संकलन समय त्रुटि फेंक (नोट करें कि यह मूल पोस्ट में के रूप में एक सरणी नहीं है) होगा इस विशेषता का उपयोग करना:

[ComImport] 
[Guid("68ADA920-3B74-4978-AD6D-29F12A74E3DB")] 
[CoClass(typeof(ConcreteDynamicCode<>))] 
public interface IDynamicCode<out TCodeOut> 
{ 
    object DynamicClassInstance { get; set; } 
    TCodeOut Execute(string value = ""); 
} 

क्या यह विशेषता कभी भी उपयोग की जानी चाहिए और यदि, तो कहां? जवाब "ज्यादातर कभी नहीं" है! हालांकि, COM इंटरऑप के लिए विशिष्ट कुछ परिदृश्य हैं जहां यह एक उपयोगी सुविधा प्रदान करेगा।

अधिक निम्नलिखित लिंक से विषय के बारे में पढ़ा जा सकता है:

+3

आप अभी भी एक इंटरफ़ेस को कम नहीं कर रहे हैं। आप एक * नई अभिव्यक्ति * में एक इंटरफ़ेस प्रकार का उपयोग कर रहे हैं लेकिन उस इंटरफ़ेस को लागू करने वाली प्रॉक्सी ऑब्जेक्ट को तुरंत चालू कर रहे हैं। यह ध्यान देने योग्य है कि यह एक ऐसा मामला है जहां एक * नई अभिव्यक्ति * अभिव्यक्ति में निर्दिष्ट प्रकार की वस्तु उत्पन्न नहीं करेगी। –

+0

यह पूरी तरह से सच है। यद्यपि ऐसी अभिव्यक्ति का वाक्यविन्यास "इंटरफ़ेस को तत्काल" माना जा सकता है, जबकि वास्तविकता में CoClassAttribute के कंपाइलर ज्ञान के माध्यम से दृश्य के पीछे एक ठोस वस्तु को तुरंत चालू किया जाता है। –

+0

आप दोनों एक ही बात कह रहे हैं, लेकिन मैं इसे कहने के लिए @Laurent LA RIZZA का तरीका पसंद करता हूं। इस परिदृश्य में आप इसे _look_ बना रहे हैं जैसे आप इंटरफ़ेस को तत्काल कर रहे हैं, वास्तव में आप संकलक को इंटरफ़ेस के लिए डिफ़ॉल्ट प्रतिस्थापन प्रकार के रूप में प्रॉक्सी क्लास का उपयोग करने का निर्देश दे रहे हैं। चूंकि जावा encapsulation पर अत्यधिक केंद्रित है, और कोड की _appearance_ को इसकी कार्यक्षमता से स्वतंत्र रूप से अनुकूलित किया जा सकता है (और यह काफी आम है), मुझे लगता है कि "अजीब" मामलों में स्पष्ट होना महत्वपूर्ण है कि यह एक हैक नहीं है, और किसी भी तरह से भाषा के नियमों का उल्लंघन नहीं करता है। –

संबंधित मुद्दे