2009-04-30 11 views
6

मेरा मतलब यह नहीं है कि एक कम व्युत्पन्न वर्ग में निचला इंटरफ़ेस या बेस क्लास कास्टिंग करने के अर्थ में गतिशील कास्टिंग का मतलब है, मेरा मतलब है कि मैंने एक इंटरफ़ेस परिभाषा ले ली है जिसे मैंने बनाया है, और फिर गतिशील रूप से उस इंटरफेस को कास्टिंग करने के लिए एक अलग ऑब्जेक्ट नहीं लिया गया है उस इंटरफेस से लेकिन सभी कॉल का समर्थन करते हैं।क्या सी # 4 "गतिशील कास्टिंग" की अनुमति देगा? यदि नहीं, तो सी # इसका समर्थन करना चाहिए?

उदाहरणों गतिशील के साथ घोषित के लिए उदाहरण के लिए

,

interface IMyInterface 
{ 
    bool Visible 
    { 
     get; 
    } 
} 

TextBox myTextBox = new TextBox(); 
IMyInterface i = (dynamic<IMyInterface>)myTextBox; 

यह जाना जाता है प्रकार के लिए संकलन समय पर प्राप्त किया जा सकता है, और क्रम। इंटरफ़ेस परिभाषा ज्ञात है, जैसा कि प्रकार (इस उदाहरण में) है, इसलिए संकलक यह निर्धारित कर सकता है कि ऑब्जेक्ट इंटरफ़ेस द्वारा परिभाषित कॉल का समर्थन करता है और हमारे लिए कास्ट रखने के लिए कुछ जादू करता है।

मेरा अनुमान है कि यह सी # 4 में समर्थित नहीं है (मैं इसका संदर्भ नहीं ढूंढ पाया), लेकिन मैं निश्चित रूप से जानना चाहता हूं। और यदि यह नहीं है, तो मैं चर्चा करना चाहता हूं कि इसे भाषा के भविष्य के संस्करण में शामिल किया जाना चाहिए या नहीं, और इसके कारण और इसके विपरीत। मेरे लिए, यह मौजूदा ढांचे प्रकारों को लपेटने के लिए पूरे नए प्रकार बनाने के बिना कोड में अधिक बहुलकता को सक्षम करने के लिए एक अच्छा जोड़ा लगता है।

अद्यतन
ऐसा न हो कि कोई मुझे साहित्यिक चोरी का आरोप, मैं Jon Skeet having already proposed this के बारे में पता नहीं था। हालांकि, यह जानकर अच्छा लगा कि हमने अत्यधिक समान वाक्यविन्यास के बारे में सोचा, जो बताता है कि यह कम से कम सहज हो सकता है। इस बीच, "एक मूल विचार है" एक और दिन के लिए मेरी बाल्टी सूची पर बना हुआ है।

+1

क्या यह अनिवार्य रूप से संरचनात्मक टाइपिंग नहीं है (http://en.wikipedia.org/wiki/Structural_typing)? – Noldorin

+0

@ नोल्डोरिन: धन्यवाद, मुझे नहीं पता था कि इसका नाम था। उस पर स्कैनिंग, मैं कहूंगा कि हाँ, यह है। –

+1

@ जेफ: हाँ, अब मैं बहुत आश्वस्त हूं कि वे * एक ही चीजें हैं, भले ही जॉन स्कीट के ब्लॉग पोस्ट पर कुछ टिप्पणियां इसे बतख टाइपिंग के रूप में वर्णित करती हैं (जो संरचनात्मक टाइपिंग से काफी अलग है)। जो भी हो, यह एक बहुत अच्छा विचार है ... शायद सी # 5 में कुछ करना चाहते हैं। :) – Noldorin

उत्तर

3

मुझे लगता है कि जॉन स्कीट के पास ऐसा प्रस्ताव था (http://msmvps.com/blogs/jon_skeet/archive/2008/10/30/c-4-0-dynamic-lt-t-gt.aspx), लेकिन अब तक, मैंने नहीं सुना है कि सी # 4.0 के पास यह होगा।

+2

डेमिट। एक दिन मेरे पास एक मूल विचार होगा। :( –

3

मुझे लगता है कि यह समस्याग्रस्त है। आप दो वर्गों के बीच युग्मन शुरू कर रहे हैं जो युग्मित नहीं हैं।

निम्नलिखित कोड पर विचार करें।

public interface IFoo 
{ 
    int MethodA(); 
    int MethodB(); 
} 

public class Bar 
{ 
    int MethodA(); 
    int MethodB(); 
} 

public class SomeClass 
{ 
    int MethodFoo(IFoo someFoo); 
} 

क्या यह कानूनी होना चाहिए?

int blah = someClass.MethodFoo((dynamic<IFoo>)bar); 

यह लगता है जैसे कि यह कानूनी होना चाहिए, क्योंकि संकलक गतिशील कुछ है कि IFoo लागू करता है के रूप में बार टाइप करने के लिए सक्षम होना चाहिए।

हालांकि, इस बिंदु पर आप IFoo और बार एक फोन के माध्यम से अपने कोड की एक पूरी तरह से अलग हिस्से में युग्मन कर रहे हैं।

आप बार संपादित करते हैं क्योंकि यह अब MethodB की जरूरत है, अचानक someClass.MethodFood अब और काम नहीं करता है, भले ही बार और IFoo संबंधित नहीं हैं।

उसी तरह, अगर आप IFoo को MethodC() जोड़ने के लिए, अपने कोड फिर से टूट जाएगा, भले ही IFoo और बार जाहिरा तौर पर संबंधित नहीं हैं।

तथ्य यह है कि, यह उन चुनिंदा मामलों में उपयोगी होगा जहां ऐसी वस्तुओं के समानताएं हैं जिन्हें आप नियंत्रित नहीं करते हैं, एक कारण है कि इंटरफेस को वस्तुओं से स्पष्ट रूप से संलग्न किया जाना चाहिए, और कारण यह है कि संकलक गारंटी ले सकते हैं कि वस्तु यह लागू करता है।

+1

लेकिन ओपी स्पष्ट रूप से इसे * गतिशील * के रूप में चिह्नित करता है। यदि यह स्थिरता तोड़ता है। गतिशील ओ = नई वस्तु(); o.InvalidMethod(); भी करना चाहिए। –

+0

डायनामिक टैग का उपयोग करने में, आप बस हाइलाइट कर रहे हैं तथ्य यह है कि आपको वस्तुओं को जोड़ना चाहिए। पहले से मौजूद 'इंटरफेस-पद्धति' कार्यों का उपयोग करते समय एक विशेष गतिशील टैग क्यों बनाते हैं? शायद आप अपनी टिप्पणी को स्पष्ट कर सकते हैं, मुझे यकीन नहीं है कि मैं इसे समझता हूं। – DevinB

+0

आपके द्वारा दिया गया उदाहरण सही नहीं है क्योंकि आप स्पष्ट रूप से डायनामिक टाइपिंग का अनुरोध नहीं कर रहे हैं। मैं स्पष्ट रूप से डायनामिक टाइपिंग का अनुरोध करता हूं, जो कि दोनों प्रकार संकलित समय पर ज्ञात हैं, तो कंपाइलर एक प्रकार की मेलबैक त्रुटि को ध्वजांकित करने के लिए उपयोग कर सकता है, या यदि रनटाइम पर, डीएलआर निर्धारित कर सकता है यदि कॉल मौजूद हैं, जैसे कि व्यक्तिगत कॉल के लिए यह करना चाहिए, यह पहले से ही सी # 4. –

1

सी # के लिए कोई ज़रूरत नहीं के रूप में यह बहुत सफाई से पुस्तकालय के रूप में लागू किया जा सकता है, इस का समर्थन करने के लिए है।

मैंने तीन या चार अलग-अलग कार्यान्वयन देखा है (मैंने उन्हें ढूंढने से पहले खुद को लिखना शुरू कर दिया था)।

http://bartdesmet.net/blogs/bart/archive/2008/11/10/introducing-the-c-ducktaper-bridging-the-dynamic-world-with-the-static-world.aspx

यह शायद भी एक बार डीएलआर क्रम में एकीकृत है लागू करने के लिए आसान हो जाएगा: यहाँ सबसे व्यापक उपचार मैंने देखा है है।

क्योंकि किसी दिए गए इंटरफ़ेस के लिए रैपर/फॉरवर्डर क्लास एक बार और फिर कैश किया जा सकता है, और उसके बाद अज्ञात प्रकार की एक वस्तु को एक बार लपेटा जा सकता है, कॉल साइट्स आदि के कैशिंग के लिए बहुत अधिक दायरा है। प्रदर्शन उत्कृष्ट होना चाहिए।

इसके विपरीत, मुझे लगता है कि dynamic कीवर्ड है, जो एक भाषा की सुविधा है, और एक बेहद जटिल से एक है, एक अनावश्यक और संभावित विनाशकारी विषयांतर है, जूता सींग वाले एक भाषा है कि पहले एक बहुत ही स्पष्ट स्थिर टाइपिंग दर्शन, था में जो भविष्य में सुधार के लिए इसे एक स्पष्ट दिशा दी। उन्हें उस पर फंस जाना चाहिए था और जब तक टाइपिंग अधिक अदृश्य नहीं हो जाती तब तक प्रकार की अनुमान बेहतर और बेहतर काम करता था। ऐसे कई क्षेत्र हैं जहां वे मौजूदा कार्यक्रमों को तोड़ने के बिना भाषा विकसित कर सकते हैं, और फिर भी वे संसाधन बाधाओं के कारण नहीं हैं (उदाहरण के कारण var का उपयोग अधिक स्थानों में नहीं किया जा सकता है क्योंकि उन्हें फिर से लिखना होगा कंपाइलर और उनके पास समय नहीं है)।

वे अभी भी सी # 4.0 (भिन्नता विशेषताओं) में अच्छी चीजें कर रहे हैं लेकिन संकलन समय पर समस्याओं का पता लगाने के लिए टाइप सिस्टम को बेहतर, अधिक स्वचालित, अधिक शक्तिशाली बनाने के लिए और भी बहुत कुछ किया जा सकता है। इसके बजाए, हम अनिवार्य रूप से एक चीज प्राप्त कर रहे हैं।

+0

मुझे लगता है कि डायनामिक कीवर्ड को शामिल करने के लिए प्रेरणा अभी भी इंटरऑपरेबिलिटी के नरक पर स्वीकार्य है। गतिशील कीवर्ड का उपयोग करके, यह भाषा की स्थाई रूप से टाइप की गई प्रकृति को बनाए रखता है और डेवलपर्स को उनके लिखने के बारे में सोचने के लिए मजबूर करता है और गतिशील रूप से टाइप की गई वस्तुओं के लिए ऑब्जेक्ट कीवर्ड का उपयोग करके, गतिशील प्रकारों के उपयोग में अंतर्निहित होता है। मुझे लगता है कि टाइपिंग अदृश्य बनाना बिल्कुल वैसा ही है जो आप स्थिर रूप से टाइप की गई भाषा में नहीं चाहते हैं। (एकाधिक स्थानों में var एक कंपाइलर पुनः लिखने से अधिक है, यह एक भाषा अर्थशास्त्र संभव है ... –

+0

... बदलें क्योंकि आपको नियमों को शामिल करना होगा कि कौन पहले एक चर निर्दिष्ट करने के लिए है (ताकि प्रकार हो सकता है सही ढंग से अनुमानित)। मुझे निश्चित रूप से गतिशीलता के रूप में गतिशील नहीं दिख रहा है - यह COM इंटरऑप जैसी चीजों के लिए एक बड़ा कदम है और एक स्थिर टाइप की गई भाषा में गतिशील भाषा समर्थन प्रदान करने का एक अच्छा तरीका है। कंपाइलर प्रकार के उपयोग के संबंध में बड़ी मात्रा में काम करता है , लेकिन मुझे यकीन नहीं है कि और अधिक करना एक अच्छा विचार है क्योंकि इससे खराब कोड का आलसी विकास हो सकता है। कंपाइलर नियमों को लागू करना चाहिए, हमें उन्हें अनदेखा करने के तरीके नहीं दे रहे हैं। –

+0

यह गतिशील भाषा समर्थन प्रदान करने का _one_ तरीका है स्थैतिक रूप से टाइप की गई भाषा; मेरे विचार में (पहले से समझाया गया है) यह गलत है। पुन: नियम लागू करना, मैं केवल हास्केल जैसी भाषाओं द्वारा किए गए अनुमान के बारे में बात कर रहा हूं। नियम लागू किए गए हैं, और इसलिए उन्हें अनदेखा नहीं किया जा सकता है। हालांकि, नी डी एक ही बात कहने के लिए * दो बार * कम हो गया है। यह एक अच्छी बात होनी चाहिए। –

1

ओपनसोर्स फ्रेमवर्क Impromptu-Interface यह सी # 4 और डीएलआर का उपयोग करता है।

using ImpromptuInterface; 

interface IMyInterface 
{ 
    bool Visible 
    { 
     get; 
    } 
} 

TextBox myTextBox = new TextBox(); 
IMyInterface i = myTextBox.ActLike<IMyInterface>(); 

यह भी ExpandoObject और DynamicObject के साथ काम करेंगे चूंकि यह डीएलआर उपयोग करता है।

+0

यह सिर्फ कलाकारों का प्रदर्शन करने से अलग कैसे है? मेरा मूल सुझाव एक विकास-पक्ष सुविधा थी जिसमें कोई रनटाइम प्रभाव नहीं था। –

+0

यह मेरा मुद्दा है कि यह अलग नहीं है - केवल उस समय यह रनटाइम के साथ काम करता है जैसा कि आज थोड़ा अलग वाक्यविन्यास है।रनटाइम लागत कम से कम है, यह बहुत हल्का वजन प्रॉक्सी उत्पन्न करता है जो स्पष्ट रूप से स्पष्ट आमंत्रण लागत को देखते हुए कैश किया जाता है, यह 1 स्थिर आमंत्रण + 1 डीएलआर आमंत्रण है। – jbtule

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