Предположим, у меня есть на структуру с помощью только одного поля:Должен ли я определять каждый оператор?
public struct Angle
{
public static readonly double RadiansPerDegree = Math.PI/180;
private readonly double _degrees;
public Angle(double degrees)
{
_degrees = degrees;
}
public double Degrees
{
get { return _degrees; }
}
public double Radians
{
get { return _degrees * RadiansPerDegree; }
}
public static Angle FromDegrees(double value)
{
return new Angle(value);
}
public static Angle FromRadians(double value)
{
return new Angle(value/RadiansPerDegree);
}
}
Это прекрасно работает, пока я не хочу делать вещи, как это:
var alpha = Angle.FromDegrees(90);
var beta = Angle.FromDegrees(100);
var inequality = alpha > beta;
var sum = alpha + beta;
var negation = -alpha;
//etc.
Итак, я реализовал IEquatable<in T>
и IComparable<in T>
, но которые до сих пор не разрешалось ни одному оператору (даже не ==
, <
, >=
и т. д.).
Итак, я начал предоставлять операционные перегрузки.
Например:
public static Angle operator +(Angle a, Angle b)
{
return new Angle(a._degrees + b._degrees);
}
public static Angle operator -(Angle a)
{
return new Angle(-a._degrees);
}
public static bool operator >(Angle a, Angle b)
{
return a._degrees > b._degrees;
}
Это работало, однако, когда я смотрел на всех операторов я вполне может перегружать (+, -, !, ~, ++, --, true, false, +, -, *, /, %, &, |, ^, <<, >>, ==, !=, <, >, <=, >=
), я начал чувствовать, что должен быть лучший способ. В конце концов, структура содержит только одно поле, и это поле является типом значения.
Есть ли способ разрешить всем операторам double
одним выстрелом? Или мне действительно нужно набирать каждого оператора, которого я, возможно, захочу поддержать вручную?
(Даже если у меня было два или три поля, я все же хотел бы иметь возможность добавлять операторы в одной партии ...)
Вы могли бы добавить неявных приведений (и, возможно, от) тип 'double', чтобы сделать это. Хотя, что-то в моей голове говорит мне, что это может быть не очень хорошая идея и может привести к двусмысленности. –
Если вы действительно делаете это только для преобразования степени и радиана, почему бы просто не создать статический класс MathHelper, который реализует эту функцию и просто использовать double вместо создания класса, который повторно изобретает другой класс с другим именем? –
@Jeff Mercado, я думаю, что неявный бросок может быть именно тем, что я ищу, на самом деле. Не могли бы вы перевести свой комментарий в ответ? Кроме того, если на самом деле есть недостаток, я бы очень признателен, если бы вы могли немного расшириться. Благодарю. – devuxer