如何编写一个重载运算符,其中两个参数都是接口

时间:2009-05-27 16:04:37

标签: c# interface operators operator-overloading

我正在为我的大多数东西使用界面。我找不到一种方法来创建一个重载操作符+,它允许我对实现IPoint接口的任何对象执行添加

代码


interface IPoint
{
    double X { get; set; }
    double Y { get; set; }
}


class Point : IPoint
{
   double X { get; set; }
   double Y { get; set; }

   //How and where do I create this operator/extension  ???
   public static IPoint operator + (IPoint a,IPoint b)
   {
     return Add(a,b);
   }

   public static IPoint Add(IPoint a,IPoint b)
   {
      return new Point { X = a.X + b.X, Y = a.Y + b.Y };
   } 
}

   //Dumb use case :
public class Test
{
   IPoint _currentLocation;

   public Test(IPoint initialLocation)
   {
     _currentLocation = intialLocation
   }
   public MoveOf(IPoint movement)
   {

      _currentLocation = _currentLocation + intialLocation;
     //Much cleaner/user-friendly than _currentLocation = Point.Add(_currentLocation,intialLocation); 
   }
}

2 个答案:

答案 0 :(得分:3)

你没有。想象一下,如果你有两个IPoint实例,a和b,两个不同的类(实现IPoint)。现在叫“a + b”。哪个运算符+被调用?返回哪种具体类型?

编辑:抱歉,澄清您的评论,“不在C#中”。关于你是否应该做到这一点,我有一些激烈的争论,因为我怀疑你可能会造成一些重大的混乱。

答案 1 :(得分:0)

我认为你不能做你所要求的事情,我已经看过去并且空洞。问题是,即使在使用.Add的示例中,您仍然需要将movement参数强制转换为Point Type才能访问该方法。我相信这是C#的限制,如果我错了,我会很高兴知道它。

我建议如果您知道总是将在Point Type中获得MoveOf,那么它将是安全的始终将其转换为方法内的Point,但如果是这种情况,那么您应该接受Point作为参数。

我唯一可以说的是,如果您最初创建Point Type并将其传递给MoveOf,则可以检查movementMoveOf的类型在投之前。这里的问题当然是你最终必须对从IPoint继承的所有类型执行此操作并使用MoveOf方法。