Разделение на подклассы позволяет вам создавать модели компонента на основе других моделей компонента следовательно. Разделение на подклассы применяется только к моделям компонента, не моделям предметной области. Синтаксис для разделения на подклассы основан на MATLAB® системный синтаксис класса для разделения на подклассы использования <
символ на линии объявления модели компонента:
component MyExtendedComponent < PackageName.MyBaseComponent % component implementation here end
Путем разделения на подклассы подкласс наследовал все члены (такие как параметры, переменные, узлы) от базового класса и может добавить собственные члены. При использовании подкласса как внешний клиент, весь public
члены базового класса доступны. Весь public
и protected
члены базового класса доступны для событий, уравнения, структуры и других разделов подкласса. Подкласс не может объявить член с тем же идентификатором как public
или protected
член базового класса.
setup
функция базового класса выполняется перед setup
функция подкласса.
Примечание
Запуск в R2019a, использование setup
не рекомендуется. Другие построения, доступные на языке Simscape™, позволяют вам достигнуть тех же результатов, не ставя под угрозу возможности во время выполнения. Для получения дополнительной информации смотрите, что настройка не рекомендуется.
Уравнения и подкласса и базового класса включены в полную систему уравнений.
Например, можно создать базовый класс ElectricalBranch.ssc
, который задает электрическую ветвь с положительными и отрицательными внешними узлами, начальный ток и напряжение и отношение между переменными компонента и узлами (и поэтому, соединяет переменные компонента с Через и Через доменные переменные). Такой компонент не очень полезен как библиотечный блок, поэтому если вы не хотите, чтобы базовый класс появился как блок в пользовательской библиотеке, устанавливаете 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
Если, например, ваш базовый класс находится в пакете под названием +MyElectrical
, затем можно задать компонент подкласса Capacitor.ssc
можно следующим образом:
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
Компонент подкласса наследовал p
и n
узлы, i
и v
переменные с начальными значениями и отношение между и доменными переменными компонента из базового класса. Таким образом, Capacitor.ssc
файл содержит только параметры и уравнения, характерные для конденсатора.
Можно заменить определенные члены базового класса в производных классах. Например, вы можете:
Замените значения по умолчанию параметров базового класса
Замените начальные значения по умолчанию, приоритеты и другие атрибуты переменных базового класса
Замените промежуточные звенья, объявленные в базовом классе
Замените атрибуты аннотации, объявленные в базовом классе, такие как Icon
или ExternalAccess
из членов базового класса
Вы не можете заменить Access
атрибут членов базового класса. Например, если член базового класса объявляется как protected
, это остается protected
во всех производных классах.
Вы не можете заменить значения или атрибуты членов базового класса, объявленных как private
.
Переопределение аннотации может быть условным выражением, за исключением типов аннотации, которые не принимают условное определение, такое как Side
. Если активная ветвь явным образом не задает переопределение аннотации, или если ни одна из ветвей не активна и else
ветвь явным образом не задана, аннотация наследовала атрибут от самого близкого базового класса в иерархии.
В этом примере, компонент подкласса Sub
:
Заменяет значение параметра базового класса bp1
.
Заменяет значение и приоритет переменной bv1
базового класса.
Заменяет промежуточное звено базового класса bm1
.
Условно заменяет значок блока и видимость параметра базового класса bp2
на основе значения параметра управления 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
Ограничения для переопределяющих значений по умолчанию параметров и переменных из базового класса:
Вы не можете сослаться на другие параметры от базового класса. Например, при переопределении значения bp1
, вы не можете сослаться на bp2
.
Вы не можете сослаться на условные параметры.
Если подкласс является составным компонентом, вы не можете параметры ссылки от его компонентов члена.
Параметры, используемые в переопределяющих параметрах и переменных из базового класса, не могут быть конфигурируемым временем выполнения.
Эти ограничения не применяются к промежуточным звеньям. В примере, параметр p1
может быть время выполнения, конфигурируемое, потому что оно используется в переопределении промежуточного bm1
. Однако, если это заменяло параметр базового класса bp1
(bp1 = p1
), затем p1
был бы ограничен временем компиляции только.