Как мне написать оператор перегрузки, где оба аргумента являются интерфейсом - PullRequest
3 голосов
/ 27 мая 2009

Я использую интерфейс для большинства своих вещей. Я не могу найти способ создать оператор перегрузки +, который позволил бы мне добавлять любые объекты, реализующие интерфейс 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 ]

3 голосов
/ 27 мая 2009

Ты не. Представьте, что у вас есть два экземпляра IPoint, a и b, оба разных класса (которые реализуют IPoint). Теперь назовите «a + b». Какой оператор + вызывается? Какой конкретный тип возвращается?

Редактировать: Извините, чтобы уточнить ваш комментарий "Не в C # в его нынешнем виде". У меня есть некоторые философские дебаты о том, должны ли вы вообще это делать, так как я подозреваю, что вы можете создать некоторое существенное замешательство.

0 голосов
/ 27 мая 2009

Я не думаю, что вы можете сделать то, что вы просите, я посмотрел в прошлое и оказался пустым. Проблема в том, что даже в вашем примере использования .Add вам все еще нужно преобразовать параметр movement в Point Type, чтобы получить доступ к этому методу. Это, я считаю, является ограничением C #, если я ошибаюсь, я был бы очень рад узнать об этом.

Я хотел бы предложить следующее: если вы знаете , вы всегда собираетесь получить Point Type в MoveOf, тогда было бы безопасно всегда приводить его к Point внутри метода, однако, если это так, то вы должны принять Point в качестве параметра.

Единственное, что я могу сказать, это то, что если вы изначально создаете Point Type и передаете его в MoveOf, вы можете проверить тип movement внутри MoveOf перед его наложением. Проблема здесь, конечно, в том, что вам в конечном итоге придется сделать это для всех типов, которые наследуются от IPoint, и использовать метод MoveOf.

...