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 < NamespaceName.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 espacio de nombres 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 * der(v);
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.