首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在开发库时,是否应该对3D点和向量使用泛型?

在开发库时,是否应该对3D点和向量使用泛型?
EN

Stack Overflow用户
提问于 2020-05-15 15:37:46
回答 1查看 100关注 0票数 0

对于某些上下文,我主要使用C++编程,但也有为一些非常有限的应用程序编写C#的经验。

我正在为C#开发一个库,它涉及到空间中的3D点的大量工作。我打算在各种上下文中使用这个库,并希望它尽可能通用,但我很难准确地锁定我应该如何处理3D点和向量,而不强制用户显式地使用我的Point3D类型。

根据我的经验,大多数应用程序都有自己的点实现,例如Rhino3D或unity的Point3D结构,它们的类型相同:包含X、Y和Z成员的结构。我想支持所有有X,Y和Z成员的结构,而不仅仅是一个。如果有帮助的话,如果我用C++编写这篇文章,我会使用模板。

我已经并且仍然在互联网上寻找解决这个问题的方法。任何帮助都是非常感谢的。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-05-15 15:44:42

如果没有更多关于您的确切问题的上下文,我会说不,在这种情况下您不应该使用泛型。C#泛型方法只能引用编译时T上已知的属性或方法。例如,此方法工作如下:

代码语言:javascript
复制
public string GetString<T>(T obj) { return obj.ToString(); }

之所以编译得很好,是因为ToString()是在System.Object上定义的,所有的东西都继承了它。

对于类似于点或向量的类型,您可能需要这样的内容:

代码语言:javascript
复制
public int GetMagnitude<T>(T vector) {
   return Math.Sqrt(vector.X + vector.Y);
}

但是,并不是所有类型都有XY,因此需要通用约束。这是官方文档:https://learn.microsoft.com/en-us/dotnet/csharp/programming-guide/generics/constraints-on-type-parameters

与您的情况相关的是,您需要约束到继承基类或实现接口的类型。类似于:

代码语言:javascript
复制
public int GetMagnitude<T>(T vector) where T : IVector {
   return Math.Sqrt(vector.X + vector.Y);
}

这里的问题是,您想要使用它的任何可能的库都必须让它们的向量类实现这个接口,而且没有一个常用的接口,这将是一个安全的选择。

可能令人感兴趣的是拟议的语言特征“形状”。https://github.com/dotnet/csharplang/issues/164

这将允许对泛型使用更多的“鸭类型”方法。

这已经积压了一段时间了。在开发周期的早期,它看起来可能是C#8的候选人,现在它是C#9的一种可能,所以不要抱太大的希望。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61823047

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档