viernes, 13 de julio de 2007

Heredar Enums

Surgió la pregunta en una lista del MUG, si se podían heredar los Enum, la pregunta concreta era si es posible hacer esto:

   1:  public enum coloresBasicos:byte 
   2:  { 
   3:    ROJO, VERDE, AZUL 
   4:  } 
   5:   
   6:  public enum coloresPersonalizados1:coloresBasicos 
   7:  { 
   8:    VIOLETA FLUOR 
   9:  } 
  10:   
  11:  public enum coloresPersonalizados2:coloresBasicos 
  12:  {
  13:     VIOLETA2 FLUOR2 
  14:  } 

Este código lo escribió Gustavo de las listas del MUG, lo tomo prestado para el ejemplo.

La verdad es que nunca lo había intentado pero me propuse comprobarlo, entonces hice un enum así:

   1:  public enum Colores 
   2:  { 
   3:    ROJO, AZUL, AMARILLO 
   4:  } 

Acto seguido intente heredarlo, y ó sorpresa, no se puede, la pregunta es por qué, ya que como digo siempre es mejor comprender que recordar, entonces volví a echar mano del Reflector y vi esto:

   1:  public enum Colores 
   2:  { 
   3:    ROJO, AZUL, AMARILLO 
   4:  } 

Es idéntico a lo que escribí, vamos como se ve en MSIL

   1:  .class public auto ansi sealed Colores extends [mscorlib]System.Enum 
   2:  { 
   3:   .field public static literal valuetype pruebaEnum.Colores AMARILLO = int32(2) 
   4:   .field public static literal valuetype pruebaEnum.Colores AZUL = int32(1) 
   5:   .field public static literal valuetype pruebaEnum.Colores ROJO = int32(0) 
   6:   .field public specialname rtspecialname int32 value__ 
   7:  } 

Y aquí está la respuesta, como vemos en la declaración la clase tiene el modificador sealed por lo tanto no se puede heredar, en resumen No se pueden heredar los enum. Hasta la próxima.