मैं निश्चित रूप से दो वर्गों के बीच रूपांतरित करने में सक्षम होना चाहता हूं जो अन्यथा असंगत हैं।क्या मैं दो कक्षाओं के लिए एक अंतर्निहित रूपांतरण जोड़ सकता हूं जिसे मैं सीधे नियंत्रित नहीं करता हूं?
कक्षाओं में से एक 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
कर सकता हूं और एफ # में रूपांतरण कर सकता हूं, लेकिन यह मेरे लिए गलत लगता है - भौतिकी लाइब्रेरी को यह नहीं पता होना चाहिए कि गेम लिखने के लिए मैं किस फ्रेमवर्क का उपयोग कर रहा हूं।
विश्वास नहीं कर सकता कि मैंने इस बारे में नहीं सोचा था, भले ही मैं काफी कोशिश कर रहा था। –