2011-08-17 14 views
5

Quiero extender .NET incorporado en la estructura Color para agregar nuevos operadores como + o -.
voy a utilizar como ellos:Extender una estructura existente en C# para agregar operadores

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

¿Es posible? si es así, ¿cómo?

+1

No estoy seguro de si esto se puede hacer, pero tengo mucha curiosidad sobre cuál sería el resultado de 'rojo - azul'? – n8wrl

+1

@ n8wrl: Es extraño, pero esperaba que '-' eliminara los valores RGB que ese color tenga del otro. – Yuck

+2

@ n8wrl sea lo contrario de la púrpura, presumiblemente :-) –

Respuesta

4

No hay forma de hacerlo con los operadores integrados.

Se puede escribir un método de extensión de tipo de fingir sin embargo:

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

Su sintaxis es incorrecta para definir un método de extensión en 'Color'. Tiene que ser una clase 'estática' con métodos' estáticos'. – Yuck

+0

Acabo de notar que me faltaban los modificadores 'estáticos'. – asawyer

+1

@asawyer, elimina 'return null'. 'Color' es un tipo de valor. –

1
+0

conozco los métodos de extensión, pero me pregunto si existe la posibilidad de utilizar operadores. –

+0

Entonces mira la respuesta de @iandotkelly. –

2

Las estructuras y las clases en C# comparten muchas similitudes, sin embargo, una de varias diferencias es que no se puede crear una subclase de una estructura. Puede usar un método de extensión para implementar un método Add() o un método Subtract(), pero no puede escribir una sobrecarga del operador en un método de extensión.

Si yo fuera usted y realmente quisiera extender la funcionalidad de una estructura existente como esta, envolvería la estructura en mi propia clase.

+0

+1 Parece un lugar extraño para usar métodos de extensión. – Yuck

3

Como otros sugirieron, puede ir de cualquier manera el métodos de extensión o la forma Decorator.

Sin embargo, tenga en cuenta que Color tiene un buen número de propiedades y métodos, por lo que redirigirlos a todos desde la clase de decorador a su estructura de Color envuelta significará escribir muchos textos repetidos. Si ir por ese camino, sin embargo, puede de hecho definir operadores y conversiones incluso implícitas de su clase a color y al revés (para que pueda utilizarlos más intercambiable), así:

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

para poner a prueba :

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

este es un buen ejemplo para una referencia, pero (en mi situación actual) simplemente haría todo más difícil. aunque el código es agradable, los operadores implícitos realmente limpian las cosas mientras escriben el código. –

+1

@can poyrazoğlu Estoy de acuerdo. Personalmente usaría extensiones en su escenario: mi ejemplo tenía más la intención de mostrarle qué desastre se convertiría en una estructura "grande" como Color .... –

0

Si no puede extenderse algo, también puede crear una clase contenedora o estructura. En muchos casos, una composición es realmente más poderosa y flexible que una extensión.

Permite la herencia múltiple, se puede actualizar fácilmente/envolver un objeto existente, etc.

No estoy diciendo que es la mejor respuesta a esta pregunta, pero sin duda algo digno de consideración. :)

Cuestiones relacionadas