2010-07-17 11 views
27

सी # में कुछ काला जादू कोड है जहां आप एक इंटरफेस के डिफ़ॉल्ट कार्यान्वयन को परिभाषित कर सकते हैं।सी # में एक इंटरफेस के डिफ़ॉल्ट कार्यान्वयन को परिभाषित करने के लिए कैसे?

तो तुम

var instance = new ISomeInterface(); 

किसी भी संकेत दिए गए लिख सकता है?

अद्यतन 1: ध्यान दें कि मैंने यह नहीं पूछा कि यह एक अच्छा विचार है या नहीं। बस यह करना कैसे संभव था।

अद्यतन 2: स्वीकृत उत्तर को देखने वाले किसी को भी।

  • "यह केवल जिज्ञासा के रूप में माना जाना चाहिए।" मार्क ग्रेवल "Newing up" Interfaces
  • "COM इंटरऑप के लिए पूरी तरह से और पूरी तरह से कुछ करने के लिए डिज़ाइन किए गए टूल का उपयोग करना एक बुरा विचार है। इससे आपके कार्ड को एरिक लिपर्ट "Newing up" Interfaces
  • से बनाए रखने वाले अगले व्यक्ति के लिए समझना असंभव हो जाता है।
  • "हालांकि यह काम कर सकता है, अगर यह कभी भी एक तर्कसंगत कोडर द्वारा उत्पादन कोड में पाया गया था, तो इसके बजाय बेस क्लास या निर्भरता इंजेक्शन का उपयोग करने के लिए इसे फिर से लागू किया जाएगा।" स्टीफन क्लेरी से नीचे एक टिप्पणी में।
+0

इस पर कुछ लेख: http: // stackoverflow। कॉम/प्रश्न/1093536 और http://blogs.msdn.com/b/ericlippert/archive/2007/04/20/chained-user-defined-explicit-conversions-in-c-part-three.aspx –

+0

क्या वहां है ऐसा करने के लिए अभी भी कोई रास्ता नहीं है? –

+0

@WilliamJockusch अभी भी केवल एक ही मुझे – Simon

उत्तर

28

यहाँ काला जादू आता है:

class Program 
{ 
    static void Main() 
    { 
     IFoo foo = new IFoo("black magic"); 
     foo.Bar(); 
    } 
} 

[ComImport] 
[Guid("C8AEBD72-8CAF-43B0-8507-FAB55C937E8A")] 
[CoClass(typeof(FooImpl))] 
public interface IFoo 
{ 
    void Bar(); 
} 

public class FooImpl : IFoo 
{ 
    private readonly string _text; 
    public FooImpl(string text) 
    { 
     _text = text; 
    } 

    public void Bar() 
    { 
     Console.WriteLine(_text); 
    } 
} 

सूचना है कि न केवल आप एक इंटरफेस का दृष्टांत कर सकते हैं बल्कि इसके निर्माता के लिए तर्क पारित :-)

+4

अच्छी तरह से मैंने कहा था कि यह काला जादू था। धन्यवाद डारिन। – Simon

+0

और कीवर्ड "CoClass" के साथ Google देवताओं फिर से मेरे साथ हैं। http://ayende.com/Blog/archive/2009/08/15/instantiating-interfaces.aspx http://marcgravell.blogspot.com/2009/08/who-says-you-cant-instantiate-interface .html – Simon

+0

@ सिमॉन, वे दो ब्लॉग हैं, मैं आपको अपने आरएसएस रीडर को ट्यून करने की सलाह दूंगा :-) –

3

केवल ISomeInterface एक वर्ग है।

(स्पष्टीकरण के लिए) अद्यतन:

जॉन स्कीट a talk जहां वह इंटरफेस के लिए डिफ़ॉल्ट कार्यान्वयन का उल्लेख है। हालांकि, वे सी # भाषा का हिस्सा नहीं हैं। बात यह है कि सी # के भविष्य के संस्करण में देखने के लिए जॉन स्कीट जैसा होगा।

अभी के लिए, केवल डिफ़ॉल्ट कार्यान्वयन (संभवतः abstract) आधार वर्गों के माध्यम से किया जाता है।

+0

पता है किसी ने सभी तर्कसंगत उत्तरों के माध्यम से गुजर लिया और ... –

+0

मैंने सभी गलत उत्तरों को कम किया। क्योंकि वे गलत थे। इसके बारे में कोई तर्कसंगतता नहीं है। Darins उत्तर – Simon

+2

देखें मैंने "सही" उत्तर देखा। हालांकि यह काम कर सकता है, अगर यह कभी भी एक तर्कसंगत कोडर द्वारा उत्पादन कोड में पाया गया था, तो इसके बजाय बेस क्लास या निर्भरता इंजेक्शन का उपयोग करने के लिए इसे फिर से लागू किया जाएगा। –

2

शायद आप निर्भरता इंजेक्शन का संदर्भ लें? कहाँ जब (जैसे Ninject या एकता के रूप में) डि ढांचे का उपयोग कर, आप डिफ़ॉल्ट उदाहरण प्रत्येक इंटरफ़ेस के लिए इस तरह इसे का उपयोग को परिभाषित करने और फिर कर सकते हैं:

(यह मानते हुए आप IWeapon इंटरफ़ेस है और Sword यह लागू करता है)

IKernel kernel = new StandardKernel(); 
kernel.Bind<IWeapon>().To<Sword>(); 
var weapon = kernel.Get<IWeapon>(); 

लेकिन निनजेक्ट (और अधिकांश अन्य आईओसी ढांचे) कुछ और चालाक चीजें कर सकते हैं, जैसे: मान लीजिए कि हमारे पास कक्षा Warrior है जो IWeapon को इसके कन्स्ट्रक्टर में पैरामीटर के रूप में लेती है। हम Ninject से Warrior का एक उदाहरण प्राप्त कर सकते हैं:

var warrior = kernel.Get<Warrior>(); 

Ninject IWeapon कार्यान्वयन हम Warrior निर्माता विधि करने के लिए निर्दिष्ट गुजरती हैं और नया उदाहरण वापस आ जाएगी।

इसके अलावा, मुझे किसी भी भाषा की सुविधा के बारे में पता नहीं है जो इस तरह के व्यवहार की अनुमति देता है।

+0

अच्छा सुझाव लेकिन मैं जो खोज रहा था वह नहीं। देखें Darins उत्तर – Simon

+1

हां, मैंने उस भाग को याद किया जहां आपने अपने प्रश्न में "काला जादू" का उल्लेख किया था :-) यह पूछने के लिए धन्यवाद - मैंने कुछ नया सीखा! – arikfr

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

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