Main Content

La traducción de esta página aún no se ha actualizado a la versión más reciente. Haga clic aquí para ver la última versión en inglés.

Creación de subclases y herencia

La creación de subclases permite obtener modelos de componentes basados en otros modelos de componentes por extensión. La creación de subclases solo se aplica a modelos de componentes, no a modelos de dominios. La sintaxis para crear subclases se basa en la sintaxis del sistema de clases de MATLAB® utilizando el símbolo < en la línea de declaración del modelo de componente:

component MyExtendedComponent < PackageName.MyBaseComponent
  % component implementation here
end

Cuando se crea una subclase, la subclase hereda todos los miembros (como parámetros, variables, nodos) de la clase base y puede añadir miembros propios. Cuando se utiliza la subclase como cliente externo, están disponibles todos los miembros public de la clase base. Todos los miembros public y protected de la clase base están disponibles para los eventos, la ecuación, la estructura y otras secciones de la subclase. La subclase no puede declarar un miembro con el mismo identificador que un miembro public o protected de la clase base.

La función setup de la clase base se ejecuta antes que la función setup de la subclase.

Nota

  • A partir de la versión R2019a, no se recomienda utilizar setup. Otros constructos disponibles en el lenguaje de Simscape™ permiten obtener los mismos resultados sin comprometer el tiempo de ejecución. Para obtener más información, consulte setup is not recommended.

Las ecuaciones de la subclase y de la clase base se incluyen en el sistema general de ecuaciones.

Por ejemplo, puede crear la clase base ElectricalBranch.ssc, que define una ramificación eléctrica con nodos externos positivos y negativos, corriente y tensión iniciales, y la relación entre variables de componentes y nodos (y, por ello, conecta las variables de componentes con las variables Through y Across de dominios). Este tipo de componente no resulta muy útil como bloque de biblioteca, por lo que, si no desea que la clase base aparezca como bloque en una biblioteca personalizada, establezca el valor de atributo Hidden=true:

component (Hidden=true) ElectricalBranch
  nodes
    p = foundation.electrical.electrical; % +:left
    n = foundation.electrical.electrical; % +:right
  end
  variables
    i = { 0, 'A' };
    v = { 0, 'V' };
  end
  branches
    i : p.i -> n.i;
  end
  equations
    v == p.v - n.v;
  end
end

Si, por ejemplo, su clase base se encuentra en un paquete denominado +MyElectrical, puede definir el componente de subclase Capacitor.ssc de la siguiente manera:

component Capacitor < MyElectrical.ElectricalBranch
% Ideal Capacitor
  parameters
    c = { 1, 'F' };
  end
  equations
      assert(c>0, 'Capacitance must be greater than zero');	
      i == c * v.der;
  end
end

El componente de subclase hereda de la clase base los nodos p y n, las variables i y v con valores iniciales, y la relación entre las variables de componentes y de dominios. De este modo, el archivo Capacitor.ssc contiene solo parámetros y ecuaciones específicos del condensador.

Anular miembros de la clase base en clases derivadas

Puede anular determinados miembros de la clase base en clases derivadas. Por ejemplo, puede:

  • Anular los valores predeterminados de los parámetros de clase base

  • Anular los valores iniciales, las prioridades y otros atributos predeterminados de las variables de clase base

  • Anular los valores intermedios declarados en la clase base

  • Anular los atributos de anotación declarados en la clase base, como Icon o ExternalAccess de los miembros de la clase base

No puede anular el atributo Access de los miembros de la clase base. Por ejemplo, si un miembro de la clase base se declara como protected, permanece como protected en todas las clases derivadas.

No puede anular valores ni atributos de los miembros de la clase base declarados como private.

La anulación de anotaciones puede ser condicional, excepto para los tipos de anotaciones que no aceptan definición condicional, como Side. Si la ramificación activa no define explícitamente una anulación de anotaciones o si ninguna de las ramificaciones están activas y no hay una ramificación else definida explícitamente, la anotación hereda el atributo de la clase base más cercana en la jerarquía.

En este ejemplo, el componente de subclase Sub:

  • Anula el valor del parámetro de clase base bp1.

  • Anula el valor y la prioridad de la variable de clase base bv1.

  • Anula el valor intermedio de clase base bm1.

  • Anula condicionalmente el icono de bloque y la visibilidad del parámetro de clase base bp2 en función del valor del parámetro de control cp1.

component Base
  parameters
    bp1 = 1;
    bp2 = 2;
  end
  variables
    bv1 = 0;
  end
  intermediates
    bm1 = 2*bv1+bp1;
  end
  annotations
    Icon = 'file1.jpg';
    bp1 : ExternalAccess = modify;
    bp2 : ExternalAccess = observe;
  end  
end
 
component Sub < Base(bp1 = 0.1,...
		     bv1.value = 1.1, ...
		     bv1.priority = priority.high, ...
		     bm1 = 2*bv1+v1+p1)
		     % override base class parameters, variables, intermediates
  parameters
    p1 = 1;
    cp1 = true;
  end
  variables
    v1 = 0;
  end
  if cp1
    annotations
      Icon = 'file2.jpg';            % override the block icon
      bp2 : ExternalAccess = modify; % override bp2 visibility to 'modify'
    end
  else
    annotations
      bp2 : ExternalAccess = none;   % override bp2 visibility to 'none'
    end
  end
  equations
    v1 == 2*p1+bp2
  end
end

Limitaciones para anular valores predeterminados de parámetros y variables de la clase base:

  • No puede hacer referencia a otros parámetros de la clase base. Por ejemplo, cuando anula el valor de bp1, no puede hacer referencia a bp2.

  • No puede hacer referencia a parámetros condicionales.

  • Si la subclase es un componente compuesto, no puede hacer referencia a parámetros de sus componentes constituyentes.

  • Los parámetros utilizados para anular parámetros y variables de la clase base no son configurables en tiempo de ejecución.

Estas limitaciones no se aplican a los valores intermedios. En el ejemplo, el parámetro p1 puede ser configurable en tiempo de ejecución porque se utiliza para anular el valor intermedio bm1. No obstante, si estuviera anulando el parámetro de clase base bp1 (bp1 = p1), p1 estaría restringido únicamente al tiempo de compilación.

Consulte también

Temas relacionados