2009-11-23 19 views
5

मेरा फ़ंक्शन कुछ लंबा मान देता है जिसमें निम्न और उच्च 32 बिट्स में दो मान होते हैं।मैं लंबे समय से क्यों नहीं प्राप्त कर सकता हूं?

मैंने सोचा कि वापसी मूल्य को संभालने का सबसे अच्छा तरीका है मेरे कस्टम प्रकार को लंबे समय से प्राप्त करना और GetLowerValue(), GetHigherValue() जैसे प्रकार के विस्तारक प्रदान करना है।

cannot derive from sealed type 'long' 

है क्यों कि इस तरह डिजाइन किया है और कैसे कर सकते हैं:

समस्या यह है कि नेट से लंबे

प्राप्त करने के लिए आप को संकलित हैं कि

public class SubmitOrderResult : long 
{ 
} 

आपको मिल अनुमति नहीं देता है इस पर काबू करो?

धन्यवाद

उत्तर

10

जैसा कि पहले से ही उल्लेख किया गया है .NET में मूल्य प्रकारों को सील कर दिया गया है, इसलिए आप लंबे समय से प्राप्त नहीं कर सकते हैं। सुझाव के अनुसार आपको एक्सटेंशन विधियां बनाना चाहिए।

उदाहरण

public static class LongExtensions 
{ 
    public static long GetLowerValue(this long value) 
    { 
     ... 
    } 

    public static long GetHigherValue(this long value) 
    { 
     ... 
    } 
} 
6

आप नेट मूल्य प्रकार से किसी से प्राप्त नहीं सकता - वे सभी परिभाषा द्वारा सील कर रहे हैं।

शायद आप अपने GetLowerValue और GetHigherValue विधियों को एक्सटेंशन विधियों के रूप में कार्यान्वित कर सकते हैं?

+1

+1 एक्सटेंशन विधियां निश्चित रूप से इस उदाहरण में जाने का तरीका हैं। – James

+0

दाएं। तो मैं विस्तार के लिए जाऊंगा। विस्तार के बारे में मुझे क्या नापसंद है कि मैं एक सामान्य लंबे प्रकार का विस्तार करूंगा जो शायद "मेरा" लंबा न हो और इसमें दो मान न हों। एक नया प्रकार प्राप्त करना अधिक प्रकार-सुरक्षित होगा। –

+0

@ जेम्स: मुझे किसी भी तरह संदेह है कि ... एक विशिष्ट प्रकार अधिक उपयुक्त लगता है। –

1

आप इसे दूर नहीं कर सकते।

long एक मुहरबंद प्रकार है और इसलिए आप उनसे प्राप्त नहीं कर सकते हैं। MSDN

क्योंकि structs को पूरी तरह से बंद कर दिया गया है, इसलिए उन्हें विरासत में नहीं मिला जा सकता है।

अधिक जानकारी के लिए, Inheritance (C# Programming Guide) देखें।

3

अगर मैं सही ढंग से समझ, अपने कार्य वास्तव में दो मूल्यों, और तथ्य यह है कि आप उन्हें पैक में एक long एक कार्यान्वयन विस्तार है देता है। उस मामले में, इस विस्तार छिपाने के लिए और एक वर्ग जो मूल्य और आवश्यक कार्रवाई में शामिल है बनाने के लिए:

public class SubmitOrderResult 
{ 
    private readonly long value_; 

    public int OneValue 
    { 
     get { return (int)(value_ >> 32); } 
    } 

    public int TheOtherValue 
    { 
     get { return (int)(value_ & 0xFFFFFFFF); } 
    } 

    public SubmitOrderResult(long value) 
    { value_ = value; } 
} 
+0

भंडारण के लिए 'long' का उपयोग क्यों करें? मैं लाभ देखने में विफल रहता हूं ... जब तक पी/Invoke (या समान परिदृश्य जहां निम्न स्तर की पहुंच समझ में आता है) के साथ इंटरऑप करने के लिए। –

+2

मैं पूरी तरह से सहमत हूं, और मैंने 'लंबा' उपयोग किया क्योंकि यह ओपी की आवश्यकता थी। जिस बिंदु को मैं बनाने की कोशिश कर रहा हूं वह यह है कि ओपी वास्तव में अपने कार्य में 'लंबे' का उपयोग करने के लिए चुनता है या नहीं, एक कार्यान्वयन विस्तार है और ग्राहकों को इसके बारे में जानने की आवश्यकता नहीं है। –

5

मेरे समारोह कुछ लंबी मूल्य जो कम और उच्च 32 बिट में दो मान हैं देता है।

यह वास्तव में, वास्तव में गंदा हैक की तरह लगता है। यह क्लोज-टू-मेटल भाषाओं (जैसे सी) के लिए उपयुक्त हो सकता है लेकिन उच्च स्तर, ऑब्जेक्ट उन्मुख भाषा के लिए नहीं।

ओओ भाषाओं में, आप टाइप सिस्टम का विस्तार करते हैं, मौजूदा बोली को अपनी बोली लगाने के लिए परेशान नहीं करते हैं। इस प्रकार, समाधान एक नया प्रकार बनाना चाहिए जो आपकी जानकारी लेता है।

+0

मेरा अनुमान है कि यह वास्तव में 'उसका' फ़ंक्शन नहीं है, क्योंकि तब उसे यह समस्या नहीं होगी। शायद यह एक बाहरी है, या कम से कम कुछ कक्षा पुस्तकालय उसके नियंत्रण से बाहर है। –

4

आप क्या कर सकते हैं अंतर्निहित रूपांतरण ऑपरेटरों के साथ एक संरचना लिखना है।

public struct SubmitOrderResult 
{ 
    private long _result; 

    public SubmitOrderResult(long result) 
    { 
     _result = result; 
    } 

    public long Result 
    { 
     get { return _result; } 
     set { _result = value; } 
    } 

    public int GetHigherValue() 
    { 
     return (int)(_result >> 32); 
    } 

    public int GetLowerValue() 
    { 
     return (int)_result; 
    } 

    public static implicit operator SubmitOrderResult(long result) 
    { 
     return new SubmitOrderResult(result); 
    } 

    public static implicit operator long(SubmitOrderResult result) 
    { 
     return result._result; 
    } 
} 

तो फिर तुम क्या कर सकते हैं: यही जिस तरह से आप चाहते हैं काम करेंगे

SubmitOrderResult result = someObject.TheMethod(); 
Console.WriteLine(result.GetHigherValue()); 
Console.WriteLine(result.GetLowerValue()); 

... बस की तरह आप चाहते थे।

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

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