Contenido principal

Definir clases de enumeraciones

Clase de enumeración

Cree una clase de enumeración añadiendo un bloque enumeration en una definición de clase. Por ejemplo, la clase WeekDays enumera un conjunto de días de la semana.

classdef WeekDays
   enumeration
      Monday, Tuesday, Wednesday, Thursday, Friday
   end
end

Para ejecutar el código MATLAB® en las secciones siguientes, coloque la definición de clase WeekDays en un archivo .m de su ruta.

Construir un miembro de una enumeración

Haga referencia a un miembro de la enumeración utilizando el nombre de la clase y el nombre del miembro:

ClassName.MemberName

Por ejemplo, asigne el miembro de enumeración WeekDays.Tuesday a la variable today:

today = WeekDays.Tuesday;

today es una variable de clase WeekDays:

whos
  Name       Size            Bytes  Class       Attributes

  today      1x1               104  WeekDays              
today
today = 

    Tuesday

Convertir a valor de superclase

Si una clase de enumeración especifica una superclase, puede convertir un objeto de enumeración a superclase pasando el objeto al constructor de la superclase. Sin embargo, el constructor de la superclase debe ser capaz de aceptar su propia clase como entrada y devolver una instancia de la superclase. Las clases numéricas integradas de MATLAB, como uint32, permiten esta conversión.

Por ejemplo, la clase Bearing se deriva de la clase integrada uint32:

classdef Bearing < uint32
   enumeration
      North (0)
      East  (90)
      South (180)
      West  (270)
   end
end

Asigne el miembro Bearing.East a la variable a:

a = Bearing.East;

Pase a al constructor de la superclase y devuelva un valor uint32:

b = uint32(a);
whos
  Name      Size            Bytes  Class      Attributes

  a         1x1                 4  Bearing              
  b         1x1                 4  uint32               

El constructor de uint32 acepta un objeto de la subclase Bearing y devuelve un objeto de clase uint32.

Definir métodos en clases de enumeraciones

Defina los métodos en una clase de enumeración como cualquier clase de MATLAB. Por ejemplo, defina un método llamado isMeetingDay para la clase de enumeración WeekDays. El caso de uso es que el usuario tiene una reunión periódica los martes. El método comprueba si el argumento de entrada es una instancia del miembro de WeekDays Tuesday.

classdef WeekDays
   enumeration
      Monday, Tuesday, Wednesday, Thursday, Friday
   end
   methods
      function tf = isMeetingDay(obj)
         tf = WeekDays.Tuesday == obj;
      end
   end
end

Llame a isMeetingDay con una instancia de la clase WeekDays:

today = WeekDays.Tuesday;
today.isMeetingDay
ans =

     1

También puede usar el miembro de enumeración como entrada directa al método:

isMeetingDay(WeekDays.Wednesday)
ans =

     0

Definir propiedades en clases de enumeraciones

Añada propiedades a una clase de enumeración cuando tenga que almacenar datos relacionados con los miembros de la enumeración. Configure los valores de la propiedad en el constructor de la clase. Por ejemplo, la clase SyntaxColors define tres propiedades. El constructor de la clase asigna los valores de los argumentos de entrada a las propiedades correspondientes cuando hace referencia a un miembro de la clase.

classdef SyntaxColors
   properties
      R
      G
      B
   end
   methods
      function c = SyntaxColors(r, g, b)
         c.R = r; c.G = g; c.B = b;
      end
   end
   enumeration
      Error   (1, 0, 0)
      Comment (0, 1, 0)
      Keyword (0, 0, 1)
      String  (1, 0, 1)
   end
end

Cuando hace referencia a un miembro de enumeración, el constructor inicializa los valores de las propiedades:

e = SyntaxColors.Error;
e.R
ans =

     1

Como SyntaxColors es una clase de valores (no se deriva de handle), solo el constructor de la clase puede establecer los valores de las propiedades:

e.R = 0
You cannot set the read-only property 'R' of SyntaxColors.

Para obtener más información sobre las clases de enumeración que definen propiedades, consulte Mutable Handle vs. Immutable Value Enumeration Members.

Secuencia de llamada a un constructor de clase de enumeración

Cada instrucción en un bloque de enumeración es el nombre de un miembro de enumeración, seguido opcionalmente por una lista de argumentos. Si la clase de enumeración define un constructor, MATLAB llama al constructor para crear las instancias enumeradas.

MATLAB proporciona un constructor predeterminado para todas las clases de enumeraciones que no definen explícitamente un constructor. El constructor predeterminado crea una instancia de clase de enumeración:

  • Usando ningún argumento de entrada, si el miembro de la enumeración no define argumentos de entrada

  • Usando los argumentos de entrada definidos en la clase de enumeración para ese miembro

Por ejemplo, los argumentos de entrada para la clase Bool son 0 para Bool.No y 1 para Bool.Yes.

classdef Bool < logical
   enumeration
      No  (0)
      Yes (1)
   end
end

Los valores de 0 y 1 son de clase logical porque el constructor predeterminado pasa el argumento a la primera superclase. Es decir, esta instrucción:

n = Bool.No;

Da como resultado una llamada a logical que es equivalente a la instrucción siguiente en un constructor:

function obj = Bool(val)
   obj@logical(val)
end

MATLAB pasa el argumento del miembro solo a la primera superclase. Por ejemplo, suponga que Bool se deriva de otra clase:

classdef Bool < logical & MyBool
   enumeration
      No  (0)
      Yes (1)
   end
end

La clase MyBool puede añadir algún comportamiento especializado:

classdef MyBool
   methods
      function boolValues = testBools(obj)
         ...
      end
   end
end

El constructor predeterminado Bool se comporta como si estuviera definido como esta función:

  • Argumento pasado al primer constructor de superclase

  • No se pasan argumentos a los constructores posteriores

function obj = Bool(val)
   obj@logical(val) 
   obj@MyBool       
end

Consulte también

Temas