Tôi đang viết một lớp về cơ bản cùng một loại phép tính cho từng loại số nguyên thủy trong C#. Mặc dù tính toán thực tế phức tạp hơn, nhưng hãy nghĩ nó là phương pháp tính trung bình của một số giá trị, ví dụ:Mã C# chung và toán tử cộng tác
class Calc
{
public int Count { get; private set; }
public int Total { get; private set; }
public int Average { get { return Count/Total; } }
public int AddDataPoint(int data)
{
Total += data;
Count++;
}
}
Bây giờ để hỗ trợ mà hoạt động tương tự cho đôi, phao và các lớp học có lẽ khác mà xác định toán tử + và nhà điều hành /, suy nghĩ đầu tiên của tôi là chỉ cần sử dụng Generics:
class Calc<T>
{
public T Count { get; private set; }
public T Total { get; private set; }
public T Average { get { return Count/Total; } }
public T AddDataPoint(T data)
{
Total += data;
Count++;
}
}
Đáng tiếc là C# là không thể xác định xem T có hỗ trợ toán tử + và/do đó không biên dịch đoạn mã trên hay không. Suy nghĩ tiếp theo của tôi là ép buộc T thành các loại hỗ trợ các toán tử đó, nhưng nghiên cứu ban đầu của tôi cho thấy điều này không thể thực hiện được.
Chắc chắn có thể đóng hộp từng loại tôi muốn hỗ trợ trong lớp thực hiện giao diện tùy chỉnh, ví dụ: IMath và hạn chế T cho điều đó, nhưng mã này sẽ được gọi là một số lượng lớn thời gian và tôi muốn tránh boxing trên không.
Có cách nào thanh lịch và hiệu quả để giải quyết vấn đề này mà không cần sao chép mã không?
Bạn không thể sử dụng LINQ? Tổng và Trung bình được hỗ trợ trên IEnumerable. – Mathias
Xem câu hỏi SO khác này: http://stackoverflow.com/questions/32664/c-generic-constraint-for-only-integers – spinon
@Mathias: Không, tôi đã sử dụng điều này làm ví dụ đơn giản về tính toán thực tế. –