我甚至不能在标题中描述我的问题。所以我现在试着好好解释一下。
假设我有这些类:
class Circle:IInteractable
{
bool Intersects(Line line)...
bool Intersects(Square line)...
bool Intersects(Circle line)...
}
class Square:IInteractable
{
bool Intersects(Line line)...
bool Intersects(Square line)...
bool Intersects(Circle line)...
}
class Line:IInteractable
{
bool Intersects(Line line)...
bool Intersects(Square line)...
bool Intersects(Circle line)...
}
所以,你可以看到我想用笛卡尔积的交函数来捕捉所有的可能性
我想把圆、方和线放到一个数据结构中。所以,我决定创建一个接口:
interface IInteractable
{
bool Intersects(Line line);
bool Intersects(Square line);
bool Intersects(Circle line);
}
现在,例如,我创建一些IInteractable对象的列表:
List<IInteractable> bodies = new List<IInteractable>();
bodies.Add(new Circle());
bodies.Add(new Line());
bodies.Add(new Circle());
bodies.Add(new Square());
bodies.Add(new Line());
我需要知道是否有一些物体相交。所以,我要做的是。
foreach ( IInteractablea in bodies)
foreach ( IInteractable b in bodies)
if( a != b)
if(a.Intersects(b))
// And here is the issue, because I have Intersects function for
// all object implementing IInteractable, but now i dont
// know with what type I am dealing with in parameter.
{
...
}
因此,在接口中添加流动函数似乎是个好主意:
bool Intersects(IInteractable obj);
我有所有函数Intersects()在每个类实现IInteractable。因此,在每个类中创建函数看起来很容易。但我还是要找出,我要处理的类型,来调用合适的函数。这意味着,我需要根据类型进行切换,但切换不允许这样做。所以我仍然可以使用它。Else if Else…但这是相当可怕的。
我的问题是:有没有更好的方法来解决我的问题?编辑:我的解决方案:
我又瞎又笨。现在,我看到了解决方案,不知道它是否是最优的,但它肯定比前一个更好。
在界面中输入:
bool Intersects(IInteractable obj);
和每个类
public virtual bool Intersects(IInteractable obj)
{
return obj.Intersects(this);
}
无需强制转换
这是一个类似于电子游戏中的碰撞检测的计算问题。如果是我,我会在你的接口上放一个机密数据库方法。在内部,你可以让一个对象询问另一个对象在它自己的空间内是否有任何点。您可以通过为每个项目设置一个矩形边界框来优化这一点,这使得计算变得容易,因为所有内容都是根据框的四个角进行计算的。然后,非矩形的形状可以只对已知在边界框内的潜在交叉点进行更细粒度的测试。至少在内部公开一个被形状边界占用的点的排序数组可能会很有用,以帮助进行检查,以及一些指示符,如果形状是开放的(线,弧)或封闭的(圆,方)