Giả sử tôi có một cấu trúc chỉ với một lĩnh vực:Tôi có phải định nghĩa mọi toán tử đơn lẻ không?
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);
}
}
này hoạt động tuyệt vời, cho đến khi tôi muốn làm những thứ như thế này:
var alpha = Angle.FromDegrees(90);
var beta = Angle.FromDegrees(100);
var inequality = alpha > beta;
var sum = alpha + beta;
var negation = -alpha;
//etc.
Vì vậy, tôi thực hiện IEquatable<in T>
và IComparable<in T>
, nhưng điều đó vẫn không bật bất kỳ toán tử nào (thậm chí không ==
, <
, >=
, v.v.).
Vì vậy, tôi đã bắt đầu cung cấp tình trạng quá tải của nhà điều hành.
Ví dụ:
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;
}
này làm việc, tuy nhiên, khi tôi nhìn vào tất cả các nhà khai thác tôi có thể hình dung quá tải (+, -, !, ~, ++, --, true, false, +, -, *, /, %, &, |, ^, <<, >>, ==, !=, <, >, <=, >=
), tôi bắt đầu cảm thấy như có phải là một cách tốt hơn. Sau khi tất cả, cấu trúc chỉ chứa một trường, và trường đó là một kiểu giá trị.
Có cách nào để cho phép tất cả các nhà khai thác của double
trong một lần phát không? Hay tôi thực sự phải loại bỏ mọi toán tử mà tôi có thể muốn hỗ trợ bằng tay?
(Thậm chí nếu tôi có hai hoặc ba lĩnh vực, tôi vẫn muốn để có thể thêm các nhà khai thác trong cùng một nhóm ...)
Bạn có thể thêm phôi ngầm để (và có thể từ) loại 'double' để làm điều đó. Mặc dù, một cái gì đó trong đầu của tôi nói với tôi rằng đó có thể không phải là một ý tưởng tốt và có thể dẫn đến sự mơ hồ. –
Nếu bạn thực sự làm điều này chỉ cho mức độ và chuyển đổi radian, tại sao không chỉ có một lớp MathHelper tĩnh thực hiện các tính năng đó và chỉ sử dụng gấp đôi thay vì tạo một lớp tái phát sinh một lớp khác với một tên khác? –
@ Jeff Mercado, tôi nghĩ rằng một diễn viên tiềm ẩn có thể chỉ là những gì tôi đang tìm kiếm, thực sự. Bạn có cân nhắc chuyển đổi nhận xét của mình thành câu trả lời không? Ngoài ra, nếu có thực sự là một nhược điểm, tôi thực sự đánh giá cao nếu bạn có thể mở rộng trên đó một chút. Cảm ơn. – devuxer