10

मैं निश्चित रूप से दो वर्गों के बीच रूपांतरित करने में सक्षम होना चाहता हूं जो अन्यथा असंगत हैं।क्या मैं दो कक्षाओं के लिए एक अंतर्निहित रूपांतरण जोड़ सकता हूं जिसे मैं सीधे नियंत्रित नहीं करता हूं?

कक्षाओं में से एक Microsoft.Xna.Framework.Vector3 है, और दूसरा एक F12 प्रोजेक्ट में उपयोग की जाने वाली Vector कक्षा है। मैं एक्सएनए के साथ सी # में एक 3 डी गेम लिख रहा हूं, और - हालांकि यह 3 डी में खींचा गया है, गेमप्ले केवल दो आयामों में होता है (यह पक्षियों-आंखों का दृश्य है)। एफ # वर्ग भौतिकी का ख्याल रखता है, एक 2 डी वेक्टर का उपयोग कर:

type Vector<'t when 't :> SuperUnit<'t>> = 
    | Cartesian of 't * 't 
    | Polar of 't * float 
    member this.magnitude = 
     match this with 
     | Cartesian(x, y) -> x.newValue(sqrt (x.units ** 2.0 + y.units ** 2.0)) 
     | Polar(m, _) -> m.newValue(m.units) 
    member this.direction = 
     match this with 
     | Cartesian(x, y) -> tan(y.units/x.units) 
     | Polar(_, d) -> d 
    member this.x = 
     match this with 
     | Cartesian(x, _) -> x 
     | Polar(m, d) -> m.newValue(m.units * cos(d)) 
    member this.y = 
     match this with 
     | Cartesian(_, y) -> y 
     | Polar(m, d) -> m.newValue(m.units * sin(d)) 

इस वेक्टर वर्ग भौतिकी परियोजना है, जो माप की देशी एफ # इकाइयों और उन्हें समूहों को एक साथ की (यूनिट लेता द्वारा प्रयोग किया जाता इकाई प्रणाली का उपयोग करता है दूरी, समय, मास, आदि)।

लेकिन एक्सएनए अपने Vector3 वर्ग का उपयोग करता है। मैं XN Vector3 पर F # Vector से एक अंतर्निहित रूपांतरण जोड़ना चाहता हूं जो का ख्याल रखता है जो गेमप्ले में दो आयाम होते हैं, जिसमें अक्ष "अप" होती है, आदि यह आसान होगा, बस Vector v -> new Vector3(v.x, v.y, 0) या कुछ।

मैं यह नहीं समझ सकता कि इसे कैसे किया जाए। मैं एफ # में एक अंतर्निहित रूपांतरण नहीं जोड़ सकता क्योंकि टाइप सिस्टम (सही) इसे अनुमति नहीं देता है। मैं इसे वेक्टर 3 कक्षा में नहीं जोड़ सकता क्योंकि यह एक्सएनए लाइब्रेरी का हिस्सा है। जहाँ तक मुझे बता सकते हैं के रूप में मैं एक विस्तार विधि का उपयोग नहीं कर सकते हैं:

class CsToFs 
{ 
    public static implicit operator Vector3(this Vector<Distance> v) 
    { 
     //... 
    } 
} 

this कीवर्ड पर कोई त्रुटि है, और

class CsToFs 
{ 
    public static implicit operator Vector3(Vector<Distance> v) 
    { 
     return new Vector3((float)v.x.units, (float)v.y.units, 0); 
    } 

    public static void test() 
    { 
     var v = Vector<Distance>.NewCartesian(Distance.Meters(0), Distance.Meters(0)); 
     Vector3 a; 
     a = v; 
    } 
} 

(a = v; पर एक त्रुटि परोक्ष परिवर्तित नहीं कर सकते है ...)।

क्या कक्षाओं में से किसी एक में कलाकार डालने में सक्षम होने के बिना ऐसा करने का कोई तरीका है? आखिरी उपाय के रूप में मैं open Microsoft.Xna.Framework कर सकता हूं और एफ # में रूपांतरण कर सकता हूं, लेकिन यह मेरे लिए गलत लगता है - भौतिकी लाइब्रेरी को यह नहीं पता होना चाहिए कि गेम लिखने के लिए मैं किस फ्रेमवर्क का उपयोग कर रहा हूं।

उत्तर

10

मदद करने के लिए पर्याप्त तेज नहीं है, नहीं, आप नहीं कर सकते। निहित ऑपरेटर को कक्षाओं में से एक के सदस्य के रूप में परिभाषित किया जाना है। हालांकि, आप एक विस्तार विधि को परिभाषित कर सकते हैं (आपका उदाहरण काम नहीं करता है क्योंकि एक्सटेंशन विधियों को public static class में होना चाहिए)।

public static class ConverterExtensions 
{ 
    public static Vector ToVector (this Vector3 input) 
    { 
     //convert 
    } 
} 
+0

विश्वास नहीं कर सकता कि मैंने इस बारे में नहीं सोचा था, भले ही मैं काफी कोशिश कर रहा था। –

2

सी # में आप नहीं कर सकते। आप उन वंशजों को प्रदान कर सकते हैं जिनमें अतिरिक्त रूपांतरण होते हैं (बशर्ते कि प्रकारों को बंद नहीं किया गया हो); या आप एक सामान्य रैपर वर्ग प्रदान कर सकते हैं जो किसी भी तरह रूपांतरण को जोड़ता है।

यह सब सुविधा इस तरीके पर निर्भर करती है कि इन रैपर/अनुकूलन मूल API के साथ कैसे उपयोग किए जा सकते हैं।

एक और नोट पर मुझे लगता है कि आप एफ # का भी उपयोग कर रहे हैं। आईआईआरसी एफ # में मेटा-प्रोग्रामिंग क्षमता का कुछ स्तर होना चाहिए (जैसे .NET के लिए कई कार्यात्मक भाषाएं, जैसे बू और नेमेर)। अगर यह यहां इस्तेमाल किया जा सकता है तो यह मुझे आश्चर्य नहीं करेगा। दुर्भाग्य से मेरा एफ

+0

मैं एक बच्चे के वर्ग का उपयोग कर के बारे में सोच रहा हूँ, मैं चिंतित यह अत्यधिक घुमावदार प्राप्त करेंगे हालांकि –

+0

इन वस्तुओं में से दोनों के रूप में दिखाई दे रही है मूल्य प्रकार के होते हैं - मुझे लगता है कि एक बच्चे के वर्ग सवाल से बाहर है। – MattDavey

+2

मैंने प्रॉक्सी क्लास का उपयोग करने के लिए निहित रूप से रूपांतरित करने का प्रयास किया, लेकिन सी # स्वचालित रूप से एक डबल रूपांतरण लागू नहीं करेगा। (और क्यों रचनाकारों को रूपांतरण ऑपरेटरों माना जाता है?) – NetMage

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

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