【发布时间】:2019-07-05 09:36:17
【问题描述】:
我有多个表示对象的类,它们都有Unity Rect 字段描述的边界。 (Zone, Room, Structure, Tunnel, Room...)
这些对象通常放在集合中。 (List<Zone>, List<Room>...)
我想要一个静态实用程序方法来测试其中一个是否与此类对象集合中的任何边界重叠,而不必使用 LINQ 强制转换列表。
public static bool BoundsOverlapsOtherBounds(Bounds bound, List<Bounds>)
我应该如何使用 C# 多态性、接口、协方差来实现这一点,而不需要先将 List<Room> 或 List<Zone> 转换为 List<Bounds>?
到目前为止,我的尝试总是产生“无法将 X 转换为 Y” 编译器错误。
【问题讨论】:
-
你可以试试
List<T> -
如果
Zone、Room等实现了一些公开矩形边界的通用接口,那么您可以在不强制转换集合的情况下执行比较。bool BoundsOverlapsOtherBounds<T>(IHasBoundaries bound, IEnumerable<IHasBoundardies> others) where T : IHasBoundaries. -
您能分享一下您的
Zone/Room/... 课程的代码吗?我假设它们都继承自Bounds类,但与往常一样,情况可能并非如此。 -
@ScottHannen
T泛型不会在其中添加任何内容,因为它没有在任何参数中使用。如果您想使用List而不是IEnumerable,则应该使用它(IEnumerable将自动用于共享父/接口,而无需泛型)。所以对于List,它类似于:BoundsOverlapsOtherBounds<T>(Bounds bound, List<T> others) where T : Bounds。我认为这将与 sri harsha 提出的解决方案类似 -
@Knoop - 将推断出通用参数。至于
IEnumerable<T>vsList,这只是一种习惯。我应该只使用List以避免在顶部引入其他内容。该问题没有指定继承自Bounds的所有内容。但无论哪种方式都是一样的。如果是这样,则通用解决方案有效。或者,如果您只是实现一些暴露边界的接口,它的工作方式完全相同。
标签: c# collections casting covariance