2011-06-29 3 views
2

Presque chaque fois que je travaille sur des applications graphiques, j'ai trouvé que je devais appliquer un algorithme que j'ai écrit dans le passé ou trouvé sur le net qui correspond parfaitement à ce dont j'ai besoin, mais différent des données structures. Par exemple, je peux avoir parfois le "Point" exprimé comme Vector2, ou comme PointF, un Point et ainsi de suite. Réutiliser un tel code dans différents projets force parfois à ajouter des références non désirées, et toujours à faire une conversion ennuyeuse des types de données, donc nous réévaluons l'algo pour la nouvelle structure de données. Donc la question: existe-t-il un moyen (intelligent) d'abstraire l'accesseur Point dans algo? Je pense que de fournir quelque chose comme un tuple de:Algorithme avec structures de points multiples

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

mais je dois faire la même chose pour le réglage des valeurs de coordonnées, donc je finis avec un tel gâchis que personne ne me ni veulent utiliser mon implémentation de l'algorithme. Comment spécifier de manière concise l'accesseur de coordonnées ponctuelles? De plus nous devons prendre en compte aussi que parfois le point peut être exprimé par un float []. Je suppose que quelque chose pourrait être fait en utilisant des arbres d'expression, mais je ne suis pas agile sur ce point donc tout conseil serait vraiment apprécié! Merci beaucoup

EDIT La mise en œuvre d'une interface est pas une option, car les classes de points ne sont pas écrites par moi, et la réflexion est pas une option pour des raisons de performance.

+0

+1 pour vos problèmes mais je suis assez convaincu qu'il n'y a pas bonne solution. –

+0

@Konrad Rudolph, dans un tel cas ne serait pas agréable d'avoir ces structures dans le système que nous avons float etc? C'est à dire un vecteur Point2d/3d et une matrice comme toujours les classes disponibles ... –

Répondre

0

Peut-être que quelque chose comme ça?

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(); 
    } 
} 

Ou est-ce que je vous ai mal compris? Je ne reçois pas vraiment vos trucs Xaccessor ... Et vous devriez également garder à l'esprit que cela va probablement ralentir votre algorithme ..

+0

Pas exactement ce que je cherche. Cela signifie obliger de créer un wrapper de classe pour le point ... –

+0

probablement? vous pariez votre * ss il est plus lent – sehe

+0

Vous n'avez pas besoin d'un wrapper de classe car les structures peuvent implémenter des interfaces. Cela devrait convenir si vous n'accédez que des valeurs dans la structure et que votre structure est vraiment immuable. La performance se dégradera légèrement car je pense que le CLR voit la méthode d'interface comme virtuelle ... –

Questions connexes