2011-08-17 16 views
5

Chcę rozszerzyć wbudowaną strukturę .NET Color, aby dodać nowych operatorów, takich jak + lub -.
będę używał ich jak:Rozszerzanie istniejącej struktury w języku C# w celu dodania operatorów

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

Czy to możliwe? jeśli tak, w jaki sposób?

+1

Nie jestem pewien, czy da się to zrobić, ale jestem bardzo ciekawy, jaki byłby efekt "czerwono-niebieskiego"? – n8wrl

+1

@ n8wrl: Naprawdę dziwne, ale spodziewałbym się, że '-' usunie dowolne wartości RGB, które ma kolor z drugiej. – Yuck

+2

@ n8wrl cokolwiek jest przeciwieństwem fioletu, prawdopodobnie :-) –

Odpowiedz

4

Nie ma sposobu, aby to zrobić z wbudowanymi operatorami.

można napisać metodę rozszerzenia do rodzaju fałszywej nim jednak:

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

Twoja składnia jest błędna przy definiowaniu metody rozszerzenia na 'Color'. Musi być klasą 'statyczną' z' statycznymi 'metodami. – Yuck

+0

Właśnie zauważyłem, że brakowało mi modyfikatorów "statycznych". – asawyer

+1

@asawyer, Usuń 'return null'. 'Kolor' to typ wartości. –

1

Spójrz na extension methods.

+0

Wiem o metodach rozszerzania, ale zastanawiam się nad możliwością użycia operatorów. –

+0

Następnie spójrz na odpowiedź @iandotkelly. –

2

Struktury i klasy w języku C# mają wiele podobieństw, jednak jedną z wielu różnic jest to, że nie można podklasować struktury. Można użyć metody rozszerzającej do implementacji metody Add() lub Subtract(), ale nie można zapisać przeciążenia operatora w metodzie rozszerzenia.

Gdybym był tobą i naprawdę chciałem rozszerzyć funkcjonalność istniejącej struktury takiej jak ta, chciałbym zawrzeć strukturę we własnej klasie.

+0

+1 Wydaje się dziwne miejsce do korzystania z metod rozszerzenia. – Yuck

3

Jak inni sugerują, można iść albo sposób rozszerzenie metod lub wzoru drogę Dekorator.

Należy jednak wziąć pod uwagę, że kolor ma wiele właściwości i metod, więc przekierowanie ich wszystkich z klasy dekoratora do zapakowanej struktury koloru będzie oznaczało napisanie wielu elementów. Jeśli pójdziesz tą drogą, jednak można rzeczywiście określić operatorów, a nawet niejawne konwersje z twojej klasy na kolor i na odwrót (tak, że można z nich korzystać więcej zamiennie), podobnie jak to:

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); 
    } 
} 

przetestować :

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

to jest naprawdę dobry przykład do odniesienia, ale (w mojej obecnej sytuacji) byłoby po prostu wszystko trudniejsze. niezły kod, niejawni operatorzy naprawiają rzeczy podczas pisania kodu. –

+1

@can poyrazoğlu Zgadzam się. Osobiście użyłbym rozszerzeń w twoim scenariuszu: mój przykład miał raczej pokazać ci, jaki bałagan stanie się w inny sposób z "dużą" strukturą, taką jak Kolor. –

0

Jeśli nie możesz czegoś rozszerzyć, możesz także utworzyć klasę opakowania lub strukturę. W wielu przypadkach kompozycja jest w rzeczywistości bardziej wydajna i elastyczna niż rozszerzenie.

Umożliwia wielokrotne dziedziczenie, można łatwo uaktualnić/zawinąć istniejący obiekt itp

Nie mówię, że jest to najlepsza odpowiedź na to pytanie, ale z pewnością coś warte rozważenia. :)

Powiązane problemy