Supponiamo che io ho una struct con un solo campo:Devo definire ogni singolo operatore?
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);
}
}
Questa grande opera, fino a che non voglio fare cose come questa:
var alpha = Angle.FromDegrees(90);
var beta = Angle.FromDegrees(100);
var inequality = alpha > beta;
var sum = alpha + beta;
var negation = -alpha;
//etc.
Così, ho implementato IEquatable<in T>
e IComparable<in T>
, ma che ancora non ha abilitato alcun operatore (nemmeno ==
, <
, >=
, ecc.).
Quindi, ho iniziato a fornire sovraccarichi dell'operatore.
Ad esempio:
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;
}
Questo ha funzionato, però, quando ho guardato tutti gli operatori che, concettualmente, potrebbe sovraccarico (+, -, !, ~, ++, --, true, false, +, -, *, /, %, &, |, ^, <<, >>, ==, !=, <, >, <=, >=
), ho iniziato a sentire come ci deve essere un modo migliore. Dopo tutto, la struttura contiene solo un campo e quel campo è un tipo di valore.
C'è un modo per abilitare tutti gli operatori di double
in un solo colpo? O devo davvero digitare ogni operatore che potrei voler supportare a mano?
(Anche se ho avuto due o tre campi, mi piace ancora di essere in grado di aggiungere gli operatori in un unico lotto ...)
Probabilmente si potrebbe aggiungere al cast impliciti (e possibilmente da) il tipo 'double' per farlo. Tuttavia, qualcosa nella mia testa mi dice che potrebbe non essere una buona idea e potrebbe portare ad ambiguità. –
Se si sta davvero facendo questo solo per la conversione in gradi e radianti, perché non avere solo una classe MathHelper statica che implementa quelle funzionalità e basta usare double invece di creare una classe che inventa un'altra classe con un nome diverso? –
@Jeff Mercado, penso che un cast implicito potrebbe essere proprio quello che sto cercando, in realtà. Prenderesti in considerazione la possibilità di convertire il tuo commento in una risposta? Inoltre, se c'è davvero un rovescio della medaglia, sarei davvero grato se potessi ampliarlo un po '. Grazie. – devuxer