是否有任何良好的方法在C#中创建通用的Vector4类? 我有几个单位(力,距离,力矩,旋转,加速度,速度等)都需要3d表示,它们都表现得非常相似,因此应该支持添加,乘法等基本功能。
每个类还包含一些特殊情况,例如force⨯distance= moment。因此,我希望能够创建一个继承自Vector4<Force>
的Force3d,因此我不必一直编写所有这些箭头,并且能够将这些特定于力的函数添加到结构中。
我一直在使用这种基于继承的方法,其中每个单元都继承自Vector4,直到现在但这会导致一些问题,因为当我例如调用Add(force1,force2)时,我得到了基类Vector4,而不是一个Force3d。所以我最终会为每个单元构建或创建Add-function的副本。
我希望能够同时创建Vector4<double>
和Vector4<Force>
,而无需重新定义所有基本函数来添加,乘法等(最好是真实运算符,这似乎是不可能的)。这也增加了一些新的问题,因为最好的解决方案是使Force继承自double,但由于所有基类型都是密封的,我必须创建一个容器类,我最终会重新定义数字的基本运算符。
我一直在尝试各种方法,但我总是最终重新定义太多东西。
答案 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
类正确地重载它自己的运算符,那么这应该不是问题,因为在泛型类型的对象上使用运算符应该正确地解析为适当的重载。