Разделение на подклассы и наследование

Разделение на подклассы позволяет вам создавать модели компонента на основе других моделей компонента следовательно. Разделение на подклассы применяется только к моделям компонента, не моделям предметной области. Синтаксис для разделения на подклассы основан на 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 был бы ограничен временем компиляции только.

Смотрите также

Похожие темы