перегрузка оператора в C#

#c# #operator-overloading

#c# #перегрузка оператора

Вопрос:

 class Point
{
    private int m_PointX;
    private int m_PointY;

    public Point(int x, int y)
    {
        m_PointX = x;
        m_PointY = y;
    }

    public static Point operator (Point point1, Point point2)
    {
        Point P = new Point();
        P.X = point1.X   point2.X;
        P.Y = point1.Y   point2.Y;

        return P;
    }
}
  

Пример:

 Point P1 = new Point(10,20);
Point P2 = new Point(30,40)
P1 P2; // operator overloading
  
  1. Обязательно ли всегда объявлять функцию перегрузки оператора как статическую? В чем причина этого?
  2. Если я хочу перегрузить , чтобы принять выражение типа 2 P2, как это сделать?

Комментарии:

1. Причина № 1 в том, что так оно и есть, поэтому вы можете легко выполнить # 2.

Ответ №1:

  1. ДА. Потому что вы не всегда имеете дело с экземплярами с операторами.
  2. Просто измените типы на те, которые вы хотите.

Вот пример для #2

 public static Point operator (int value, Point point2)
{
 // logic here.
}
  

Вам придется поступить с параметрами по-другому, если вы хотите P2 2 работать.

Смотрите http://msdn.microsoft.com/en-us/library/8edha89s.aspx для получения дополнительной информации.

Ответ №2:

Чтобы ответить на ваши вопросы:

  1. Да, вам нужно определить их как статические. Они не являются методами экземпляра, они также могут работать с null s.
  2. Вам нужно будет определить перегрузку оператора, где один из параметров имеет тип int

Комментарии:

1. Если вы добавляете int point вместо point int, будет ли это по-прежнему выполнять операцию правильно?

2. в C , если перегрузка оператора определяется функцией-членом, то нам нужно передать один параметр, или, если определено функцией friend, нам нужно определить два параметра. Возможно ли объявить метод перегрузки оператора как функцию-член?

3. Нет, невозможно объявить его как элемент экземпляра, вам нужно объявить его как статический. Кроме того, для обработки int point так же хорошо, как point int вам нужно объявить две перегрузки оператора. Причина в том, что int point может привести к другому результату, чем point int . Например, первый может добавлять расстояние от начала координат к целому в виде числа, тогда как второй может смещать точку на заданное значение. (т.Е. один создает новый int, другой — новую точку.)

4. по какой причине операторы были перегружены как статические?

5. Я не знаю, вам пришлось бы пинговать Эрика Липперта или кого-нибудь из ребят-компиляторов. В любом случае, они являются статическими, и обойти это невозможно.

Ответ №3:

Оба предыдущих ответа касаются ваших вопросов, поэтому я не собираюсь вторгаться в них, но вот пример использования 2 P:

    public static Point operator (int yourInt, Point point)
    {
        Point P = new Point();
        P.X = point.X   yourInt;
        P.Y = point.Y   yourInt;

        return P;
    }