2017-09-25 13 views
5

सी # 7 में हम Deconstruct विधि को कार्यान्वित कर सकते हैं जिसे किसी ऑब्जेक्ट को मिलान प्रकारों के साथ टुपल में निर्दिष्ट करते समय बुलाया जाएगा।सी # 7: एक इंटरफेस के माध्यम से ट्यूपल डीकनस्ट्रक्शन क्यों लागू नहीं किया जाता है?

मुझे आश्चर्य है कि माइक्रोसॉफ्ट ने इसे "जादू विधि" के रूप में लागू करने का फैसला क्यों किया। यह विशेष रूप से नामित विधि है जिसे कहीं से विरासत में नहीं मिला है और यदि आप इसे सही नाम देते हैं और सही पैरामीटर डालते हैं, तो आप इस ऑब्जेक्ट को संबंधित टुपल को असाइन करने में सक्षम होंगे।

मुझे कल्पना होगी कि डिजाइन टीम इस उद्देश्य के लिए एक इंटरफेस तैयार करेगी।

कुछ की तरह:

public interface IDecontructible<T1> 
{ 
    void Deconstruct(out T1 a); 
} 

public interface IDecontructible<T1, T2> 
{ 
    void Deconstruct(out T1 a, out T2 b); 
} 

public interface IDecontructible<T1, ... ,Tn> 
{ 
    void Deconstruct(out T1 a, ... ,out Tn n); 
} 

बेशक वहाँ मापदंडों के विभिन्न संख्या के साथ और अधिक इंटरफेस होना जरूरी होगा।

क्या इस डिजाइन विकल्प के लिए कोई स्पष्ट कारण है, कि मुझे याद आ रही है?

+0

FWIW इस विशिष्ट बिट के लिए डिज़ाइन नोट्स [यहां उपलब्ध हैं] (https://github.com/dotnet/csharplang/blob/master/meetings/2016/LDM-2016-05-03-04.md), आगे की चर्चाओं [मुख्य Deconstruction पृष्ठ से जुड़े] के साथ [https://github.com/dotnet/roslyn/blob/master/docs/features/deconstruction.md)। –

+1

इंटरफेस के साथ नामों की धारणा संभव नहीं होगी। –

उत्तर

10

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

class Employee { 
    public string FirstName {get;set;} 
    public string Id {get;set;} 

    Deconstruct (out string firstName){ 
    firstName = FirstName; 
    } 

    Deconstruct (out string firstName, out string LastName){ 
    firstName = FirstName; 
    lastName = LastName; 
    } 

    Deconstruct (out int id){ 
    id = EmployeId; 
    } 
} 

वर्तमान कार्यान्वयन के साथ, आपके पास डेकनस्ट्रक्चर के तीन संस्करण हो सकते हैं। साथ ही, आप विस्तार विधि के रूप में Deconstruct विधि को लागू कर सकते हैं। ये पैटर्न एक इंटरफेस कार्यान्वयन के साथ संभव नहीं होगा।

+0

आपके पास विस्तार विधियों के साथ एक अच्छा बिंदु है ... मुझे लगता है कि आप कई Deconstruct विधियों को लागू करने के लिए विभिन्न तर्कों के साथ कई इंटरफेस का एहसास कर सकते हैं। –

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