2013-04-20 3 views
1

Я использую C# XNA, и я обнаружил, что, пытаясь добавить две точки вместе, это не позволит мне. Есть ли способ добавить класс Point для запуска этого кода.Оператор сложения программ C# для Point

Point a = new Point(3,4); 
Point b = new Point(6,2); 
Point c = a + b; //Should equal new Point(9,6); 
+1

'var c = новая точка (a.X + b.X, a.Y + b.Y);'? – Corak

+0

Невозможно добавить к классу Point класс, позволяющий использовать оператор +? – redcodefinal

ответ

3

Вы можете просто перегрузить оператор + - как это:

class Point 
{ 
    public int X { get; private set; } 
    public int Y { get; private set; } 

    public Point(int x, int y) 
    { 
     X = x; 
     Y = y; 
    } 

    public static Point operator +(Point p1, Point p2) 
    { 
     return new Point(p1.X + p2.X, p1.Y + p2.Y); 
    } 
} 

Теперь ваш код компилируется в работе, как вы ожидаете его:

Point a = new Point(3, 4); 
Point b = new Point(6, 2); 
Point c = a + b; //Should equal new Point(9,6); - and it is :) 

Более подробную информацию о перегрузкой операторов можно найти на MSDN.

+0

Хотя это явно не указано, OP, вероятно, ссылается на 'System.Drawing.Point', а не на собственный класс' Point', где, как вы описали, он мог бы легко перегрузить оператора. – Corak

+0

@ Корак Ах я вижу - спасибо за обновление :) –

+0

Я делаю, но это именно то, что я искал! Спасибо! A ++ – redcodefinal

1

Добавить в отдельный класс.

public static void Add(this Point a, Point b){ 
    a.X += b.X; 
    a.Y += b.Y; 
} 
+2

Вы уверены, что хотите изменить 'a'? В вашем OP вы оставляете 'a' и' b' в одиночку и создаете новый 'Point c'. – Corak

1

Вы можете добавить Размер-структуру с точки структуры, и легко конвертировать между ними, передавая точку в до размера конструктора, как это:

c = a + (new Size(b)); 

Почему DOT NET выбрать усилить это тонкое различие между интенсивными и обширными кортежами вне меня.

+1

пример: 'Point c = a + (размер) b;' – Corak

+0

Этот комментарий должен быть принятым ответом. – TaW

1

Вы можете использовать добавочные методы, как показано ниже

class Program 
{ 
    static void Main(string[] args) 
    { 
     Point a = new Point(1, 2); 
     Point b = new Point(2, 4); 

     Point c=a.AddPoints(b); 
    } 
} 

public static class MyExtensions 
{ 
    public static Point AddPoints(this Point x, Point y) 
    { 
     return new Point(x.X + y.X, x.Y + y.Y); 
    } 
} 
+0

Я уже ответил на это с помощью расширений. См. Выше. Я просто хотел иметь возможность использовать оператор + вместо того, чтобы использовать метод для добавления двух точек. – redcodefinal

1

Технически, вы могли бы использовать статический метод, метод расширения и, возможно, даже перегрузку оператора, как и другие ответы предполагают.

Тем не менее, .NET имеет как Point и Size, чтобы захватить семантическое различие:

  • Point относится к точке, как правило, по сравнению с произвольной точкой отсчета.
  • Size относится к вектору - расстояние с направлением, или расстояние Х & расстояние Y.

Добавление Point сек будет бессмысленным. Например, если Point s относятся к координатам на географической карте - что бы они значили? «50 ° широты» + «60 ° широты» = «110 ° широты»? Вот почему .NET мудро решил не применять оператор добавления.

Однако, добавление Point и Size может иметь разумный смысл - «50 ° широты» + «1 ° широты» = «51 ° широты» - хороший ответ.

PS. Обратите внимание на сходство с различием между DateTime и TimeSpan.

TL; DR - один или оба ваших Point с фактически должен быть Size - изменить его в кратчайшем месте.

Смежные вопросы