2012-12-12 28 views
6

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

7

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).

+0

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

+1 để đề xuất T4. –

0

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

+4

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 đủ. –

+0

@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 đó. –

+0

Điều này có hữu ích không? http://www.codeproject.com/Articles/33617/Arithmetic-in-Generic-Classes-in-C – GracelessROB

Các vấn đề liên quan