Xin lỗi nếu tiêu đề bị viết sai. Hãy nói rằng tôi có một tia tracer và tôi muốn có khả năng sử dụng hoặc nổi hoặc đôi. Làm thế nào tôi có thể làm cho nó có thể tuyên bố một trường hợp mới của lớp lựa chọn hoặc nổi hoặc tăng gấp đôi? Tôi không muốn tạo ra hai lớp và gọi một lớp và một đĩa đơn khác.Làm thế nào tôi có thể cho phép một lớp được khai báo sử dụng phao hoặc tăng gấp đôi?
Trả lời
Không có một cách sạch để xử lý này trong .NET. Generics không hỗ trợ trực tiếp các phép toán số học. Bạn có thể giải quyết vấn đề này thông qua các giải pháp như MiscUtils hoặc thông qua creation of a separate calculator class and delegating the math to it, nhưng điều này thường làm cho mã phức tạp hơn việc có hai triển khai.
Bạn có thể sử dụng dynamic
tại đây, nội bộ cũng sẽ hoạt động. Tuy nhiên, điều này sẽ thêm một chi phí (nhẹ), có thể giảm thiểu tính hữu ích của việc này. Nếu hiệu suất là lý do chính bạn không muốn chỉ hỗ trợ phép tính hai lần, thì việc sử dụng động có lẽ không phải là một lựa chọn.
Một tùy chọn sẽ là sử dụng T4 để tạo mẫu xây dựng cả hai phiên bản của mã từ một tệp nguồn duy nhất. Điều này sẽ cung cấp cho bạn đầy đủ, hỗ trợ bản địa mà không cần chi phí (về cơ bản nó chỉ viết hai lớp cho bạn).
Bạn có thể sử dụng C# Generics cho việc này:
using System;
class Test<T>
{
T _value;
public Test(T t)
{
// The field has the same type as the parameter.
this._value = t;
}
public void Write()
{
Console.WriteLine(this._value);
}
}
class Program
{
static void Main()
{
// Use the generic type Test with an int type parameter.
Test<int> test1 = new Test<int>(5);
// Call the Write method.
test1.Write();
// Use the generic type Test with a string type parameter.
Test<string> test2 = new Test<string>("cat");
test2.Write();
}
}
Blog này mô tả nó một cách chi tiết hơn một chút cho bạn http://www.dotnetperls.com/generic
Trong khi điều này làm việc, bạn không thể làm gì nhiều với nó, như generics không hỗ trợ hỗ trợ số học đầy đủ. –
@ReedCopsey Đó là lý do tại sao tôi muốn tất cả các đối tượng số trong .NET thực hiện một giao diện có tất cả các hoạt động toán học trên đó. –
Điều này có hữu ích không? http://www.codeproject.com/Articles/33617/Arithmetic-in-Generic-Classes-in-C – GracelessROB
- 1. Được tăng gấp đôi so với phao nổi trong C#?
- 2. Khai báo phao nổi, tại sao loại mặc định tăng gấp đôi?
- 3. Làm thế nào là phao và tăng gấp đôi đại diện trong C + + (gcc)?
- 4. Tăng gấp đôi tiền của tôi: khung của tôi sử dụng gấp đôi số tiền tiền mặt
- 5. cho vòng lặp, tăng thêm gấp đôi
- 6. Làm thế nào tôi có thể chia hai số nguyên để có được gấp đôi?
- 7. Không thể chuyển đổi từ đôi [] [] để tăng gấp đôi [*, *]
- 8. Làm thế nào tôi có thể "bỏ đặt" một lớp đã được khai báo
- 9. Điều gì làm tăng gấp đôi (!!) được sử dụng trên biến không phải là boolean?
- 10. làm tròn tăng gấp đôi - .5 - sprintf
- 11. để so sánh gấp đôi và số thập phân tôi có nên truyền gấp đôi sang thập phân hay thập phân để tăng gấp đôi không?
- 12. Làm thế nào tôi có thể làm tròn một phao?
- 13. mảng loại tăng gấp đôi trong C
- 14. C++ đúc tĩnh hai chiều mảng đôi tăng gấp đôi **
- 15. Sử dụng DTD, một phần tử có thể được khai báo cho phép bất kỳ nội dung XML nào không?
- 16. Cảnh báo: number_format() dự kiến tham số 1 để được tăng gấp đôi
- 17. Tăng gấp đôi một số - chuyển trái vs nhân
- 18. dereference gán để một OutputIterator gấp đôi tăng lên
- 19. Tại sao (gấp đôi) 0.6f> (gấp đôi) (6/10f)?
- 20. Làm thế nào để làm cho một phao sử dụng phao và không phải điểm?
- 21. Điều gì làm tăng gấp đôi [,,] đại diện?
- 22. Tôi có nên khai báo logger logger một lần cho mỗi lớp hoặc trong lớp cơ sở?
- 23. Tôi có thể khai báo "sử dụng không gian tên" bên trong một lớp C++ không?
- 24. Đúc tăng :: đơn vị :: số lượng để tăng gấp đôi
- 25. Làm thế nào tôi có thể nhận được hành vi chương trình nhất quán khi sử dụng phao nổi?
- 26. Tăng gấp đôi với tăng :: tinh thần :: lex & khoảng trắng
- 27. Làm thế nào để tôi trong JDBC đọc một giá trị có thể null gấp đôi từ resultSet?
- 28. Làm thế nào để sử dụng một giá trị null trong một đôi trong VB.Net 2010?
- 29. Làm thế nào để mảng đầu ra tăng gấp đôi vào ổ cứng?
- 30. tôi cần phải chuyển đổi một biến int tăng gấp đôi
Bah Tôi viết một ví dụ hoàn chỉnh bằng cách sử dụng năng động và câu trả lời của bạn sẽ thổi tôi ra khỏi nước: (+1 cho bạn, bạn thắng vòng này. –
+1 để đề xuất T4. –