我可以为两个我不直接控制的类添加隐式转换吗? [英] Can I add an implicit conversion for two classes which I don't directly control?

查看:82
本文介绍了我可以为两个我不直接控制的类添加隐式转换吗?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我希望能够在否则不兼容的两个类之间隐式转换.

I'd like to be able to implicitly convert between two classes which are otherwise incompatible.

其中一个类是Microsoft.Xna.Framework.Vector3,另一个类只是F#项目中使用的Vector类.我正在用XNA用C#编写3D游戏,而且-尽管它是用3D绘制的,但是游戏的玩法却只发生在两个维度上(这是鸟瞰图). F#类使用2D向量来处理物理问题:

One of the classes is Microsoft.Xna.Framework.Vector3, and the other is just a Vector class used in an F# project. I'm writing a 3d game in C# with XNA, and -- although it's drawn in 3D, the gameplay takes place in only two dimensions (it's a birds-eye-view). The F# class takes care of the physics, using a 2D vector:

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))

此向量类利用了物理项目使用的单位系统,该单位系统采用本地F#度量单位并将它们分组在一起(距离,时间,质量等单位).

This vector class makes use of the unit system used by the physics project, which takes native F# units of measure and groups them together (units of Distance, Time, Mass, etc).

但是XNA使用其自己的Vector3类.我想添加一个从F#Vector到XNA Vector3的隐式转换,该转换负责处理游戏发生的两个维度,哪个轴在上"等的" ". d很简单,只需Vector v -> new Vector3(v.x, v.y, 0)之类的.

But XNA uses its own Vector3 class. I want to add an implicit conversion from the F# Vector to the XNA Vector3 which takes care of which two dimensions the gameplay takes place in, which axis is "up", etc. It'd be simple, just Vector v -> new Vector3(v.x, v.y, 0) or something.

虽然我不知道该怎么做.我不能在F#中添加隐式转换,因为类型系统(正确)不允许这样做.我不能将其添加到Vector3类中,因为它是XNA库的一部分.据我所知,我不能使用扩展方法:

I can't figure out how to do it though. I can't add an implicit conversion in F# because the type system (rightly) doesn't allow it. I can't add it to the Vector3 class because that is part of the XNA library. As far as I can tell I can't use an extension method:

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;上的错误(无法隐式转换...).

is an error on a = v; (cannot implicitly convert...).

是否有一种方法可以在没有将转换放入任何一个类的情况下进行此操作?作为最后的选择,我可以open Microsoft.Xna.Framework并用F#进行转换,但这对我来说似乎是错误的-物理库不应该知道或不在乎我使用什么框架编写游戏.

Is there a way to do this without being able to put the cast in either of the classes? As a last resort I could open Microsoft.Xna.Framework and do the conversion in F#, but that seems wrong to me -- the physics library shouldn't know or care what framework I'm using to write the game.

推荐答案

不,您不能.隐式运算符必须定义为这些类之一的成员.但是,您可以定义扩展方法(您的示例无法使用,因为扩展方法必须在public static class中).

No, you can't. The implicit operator has to be defined as a member of one of the classes. However, you can define an extension method (your example didn't work as extension methods have to be in a public static class).

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

这篇关于我可以为两个我不直接控制的类添加隐式转换吗?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆