2011-08-17 3 views
5

Tôi muốn mở rộng cấu trúc Color được tích hợp sẵn của .NET để thêm toán tử mới như + hoặc -.
Tôi sẽ sử dụng chúng như:Mở rộng cấu trúc hiện có trong C# để thêm toán tử

Color c1 = Color.FromName("Red"); 
Color c2 = Color.FromName("Blue"); 
Color result = c2 - c1; 

Có thể không? nếu có, làm thế nào?

+1

Tôi không chắc chắn nếu điều này có thể được thực hiện nhưng tôi rất tò mò về kết quả của 'đỏ - xanh' sẽ là gì? – n8wrl

+1

@ n8wrl: Thật kỳ lạ, nhưng tôi mong đợi một '-' để loại bỏ bất kỳ giá trị RGB có màu nào khác. – Yuck

+2

@ n8wrl bất kể đối diện của màu tím là gì, có lẽ :-) –

Trả lời

4

Không có cách nào để thực hiện điều đó với các toán tử tích hợp.

Bạn có thể viết một phương pháp khuyến nông để loại giả nó mặc dù:

public static class Extensions 
{ 
    public static Color Substract(this Color color, Color theOtherColor) 
    { 
     //perform magic here! 
     //be sure to return something or this won't compile 
    } 
} 

Color c1 = Color.FromName("Red"); 
Color c2 = Color.FromName("Blue"); 
Color result = c2.Subtract(c1); 
+0

Cú pháp của bạn sai khi xác định phương thức mở rộng trên 'Màu'. Phải là một lớp 'static' với phương thức' static'. – Yuck

+0

Tôi chỉ nhận thấy tôi đã bỏ lỡ các biến tố 'tĩnh'. – asawyer

+1

@asawyer, Xóa 'trả về null'. 'Màu' là một kiểu giá trị. –

1

Nhìn vào extension methods.

+0

Tôi biết về các phương pháp mở rộng, nhưng chỉ cần tự hỏi khả năng sử dụng các toán tử. –

+0

Hơn nhìn vào câu trả lời @iandotkelly. –

2

Các cấu trúc và lớp trong C# chia sẻ rất nhiều điểm tương đồng, tuy nhiên một trong nhiều khác biệt là bạn không thể phân lớp cấu trúc. Bạn có thể sử dụng một phương thức mở rộng để thực hiện một phương thức Add() hoặc Subtract(), nhưng bạn không thể viết một toán tử quá tải trong một phương thức mở rộng.

Nếu tôi là bạn và tôi thực sự muốn mở rộng chức năng của cấu trúc hiện có như thế này, tôi sẽ bọc cấu trúc trong lớp của riêng tôi.

+0

+1 Nó có vẻ giống như một nơi lạ để sử dụng các phương pháp mở rộng. – Yuck

0

Tôi sẽ nói rằng những điều này đã tồn tại, bạn có đang nói về việc định nghĩa lại chúng không? Đây là các hoạt động trên alpha và RGB của màu sắc. Xem dưới đây:

http://msdn.microsoft.com/en-us/library/system.windows.media.color.op_subtraction.aspx

http://msdn.microsoft.com/en-us/library/system.windows.media.color.op_addition.aspx

+0

Đối tượng 'Color' mà OP đang hỏi về tồn tại trong không gian tên' System.Drawing'. Không phải người bạn đã tham chiếu. – Yuck

3

Như những người khác đề nghị, bạn có thể đi một trong hai phương pháp khuyến nông bằng cách này hay mô hình cách trang trí. Tuy nhiên, hãy xem xét rằng Màu sắc có số lượng và các phương thức và các phương thức hợp lý, do đó chuyển hướng tất cả chúng từ lớp trang trí đến cấu trúc Màu được bao bọc của bạn sẽ có nghĩa là viết nhiều bản mẫu. Nếu bạn đi con đường đó, tuy nhiên, bạn có thể thực sự xác định khai thác và chuyển đổi thậm chí tiềm ẩn từ lớp học của bạn là Color và ngược lại (vì vậy mà bạn có thể sử dụng chúng thay thế cho nhau nhiều hơn), như thế này:

public class MyColor { 
    public System.Drawing.Color val; 

    public MyColor(System.Drawing.Color color) 
    { 
     this.val = color; 
    } 

    public static MyColor AliceBlue 
    { 
     get { 
      return new MyColor(System.Drawing.Color.AliceBlue); 
     } 
    } 

    public override string ToString() 
    { 
     return val.ToString(); 
    } 
    // .... and so on.... 

    // User-defined conversion from MyColor to Color 
    public static implicit operator System.Drawing.Color(MyColor c) 
    { 
     return c.val; 
    } 
    // User-defined conversion from Color to MyColor 
    public static implicit operator MyColor(System.Drawing.Color c) 
    { 
     return new MyColor(c); 
    } 
} 

để kiểm tra :

MyColor c = System.Drawing.Color.AliceBlue; // assigning a Color to a MyColor 
              // thanks to the implicit conversion 
Console.WriteLine(c.ToString()); // writes "Color [AliceBlue]" 
+0

đây là một ví dụ thực sự tốt đẹp để tham khảo, nhưng (trong tình hình hiện tại của tôi) nó sẽ chỉ làm cho mọi thứ khó khăn hơn. tốt đẹp mã mặc dù, các nhà khai thác tiềm ẩn thực sự làm sạch những điều trong khi viết mã. –

+1

@can poyrazoğlu Tôi đồng ý. Tôi cá nhân sẽ sử dụng phần mở rộng trong kịch bản của bạn: ví dụ của tôi là có nghĩa là để cho bạn thấy những gì một mớ hỗn độn theo cách khác sẽ trở thành với một cấu trúc "lớn" như màu .... –

0

Nếu bạn không thể mở rộng thứ gì đó, bạn cũng có thể tạo lớp hoặc cấu trúc bao bọc. Trong nhiều trường hợp, bố cục thực sự mạnh mẽ và linh hoạt hơn phần mở rộng.

Nó cho phép đa kế thừa, bạn có thể dễ dàng nâng cấp/quấn một đối tượng hiện, vv

Tôi không nói rằng nó là câu trả lời tốt nhất cho câu hỏi này, nhưng chắc chắn một cái gì đó đáng để xem xét. :)