C#创建通用的Vector4类?

时间:2009-06-28 12:45:07

标签: c# generics 3d

是否有任何良好的方法在C#中创建通用的Vector4类? 我有几个单位(力,距离,力矩,旋转,加速度,速度等)都需要3d表示,它们都表现得非常相似,因此应该支持添加,乘法等基本功能。

每个类还包含一些特殊情况,例如force⨯distance= moment。因此,我希望能够创建一个继承自Vector4<Force>的Force3d,因此我不必一直编写所有这些箭头,并且能够将这些特定于力的函数添加到结构中。

我一直在使用这种基于继承的方法,其中每个单元都继承自Vector4,直到现在但这会导致一些问题,因为当我例如调用Add(force1,force2)时,我得到了基类Vector4,而不是一个Force3d。所以我最终会为每个单元构建或创建Add-function的副本。

我希望能够同时创建Vector4<double>Vector4<Force>,而无需重新定义所有基本函数来添加,乘法等(最好是真实运算符,这似乎是不可能的)。这也增加了一些新的问题,因为最好的解决方案是使Force继承自double,但由于所有基类型都是密封的,我必须创建一个容器类,我最终会重新定义数字的基本运算符。

我一直在尝试各种方法,但我总是最终重新定义太多东西。

2 个答案:

答案 0 :(得分:1)

关于重载运算符,有一个解决方案here,它解释了如何使用.Net 3.5(使用Jon Skeet的MiscUtil库)。

要在方法的结果中获得正确的类型,您可以使用以下内容:

public class Vector<T>
{
    public T x { get; }
    public T y { get; }
}

public class VectorWithOperators<TVector, T> : Vector<T> 
   where TVector : Vector<T>, new()
{
    public TVector GetSomeResult()
    {
        return new TVector();
    }
}

public class Force3D : VectorWithOperators<Force3D, double>
{
}

答案 1 :(得分:-1)

您只需要为基础Vector4<T>类创建泛型运算符重载。只要你的Force类正确地重载它自己的运算符,那么这应该不是问题,因为在泛型类型的对象上使用运算符应该正确地解析为适当的重载。