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
oExternalAccess
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 controlcp1
.
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 abp2
.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.