2011-06-29 34 views
2

几乎每次我在图形应用程序上工作时,都发现我必须应用一种算法,这是我在过去编写的或在网上找到的,它在概念上完全符合我所需,但与数据不同结构。例如,我可以有时将“点”表示为Vector2,或者表示为PointFPoint等。在不同的项目中重用这样的代码有时会强制添加不需要的引用,并且始终要从数据类型中进行一些无聊的转换,所以我们重新为新数据结构重写算法。所以问题是:在算法中抽象Point访问器是否存在(智能)方法?我想提供类似的元组:具有多重点结构的算法

Func<TCoord,TPoint> Xaccessor 
Func<TCoord,TPoint> Yaccessor 
... 
Func<TCoord,TPoint> ...accessor 

但我不得不设置的坐标值,这样做,所以我没有一个既不我想用我的算法实现这样一个烂摊子结束。如何简洁地指定点坐标访问器?另外我们也必须考虑到,有时候这个点可以用float []表示。我猜想可以通过使用表达式树来完成,但是我对此不敏感,所以任何建议都会真正感谢! 非常感谢

编辑实现一个接口是不是一种选择,因为点班是不是我写的,和反思是不是性能原因的选项。

+0

为你的烦恼+1,但我相信,没有好的解决方案 –

+0

@Konrad Rudolph,在这种情况下不会很高兴在系统中拥有这些结构,因为我们有浮动等等?即一个Point2D/3D矢量和矩阵作为始终可用的类... –

回答

0

也许这样的事?

interface ICoordinate<T> { T GetX(int idx); T GetY(int idx); } 

class PointRepresentation : ICoordinate<T> { 
    PointTypeArrayOrWhatever a; 
    T GetX(int idx) { return a.GetX; } 
} 

class MyAlgorithm { 
    ICoordinate accessor; 
    void Compute() { 
     // do something with accessor.GetX(); 
    } 
} 

还是我误读了你?我真的没有得到你的Xaccessor的东西...... 你也应该记住,这可能会减慢你的算法。

+0

不完全是我在找什么。这意味着强制创建类包装的点... –

+0

可能?你打赌你的* ss更慢 – sehe

+0

由于结构可以实现接口,因此不需要类封装器。如果你只访问struct中的值并且你的结构是真正不可变的,这应该没问题。性能会稍微有所下降,因为我认为CLR将界面方法看作是虚拟的...... –