exponenta event banner

Оценка выражений в определениях классов

Зачем использовать выражения

Выражение, используемое в определении класса, может быть любой допустимой инструкцией MATLAB ®, которая вычисляется как один массив. Выражения используются для определения значений свойств по умолчанию и в спецификациях атрибутов. Выражения полезны для получения значений в терминах других значений. Например, предположим, что необходимо определить свойство константы с полным значением точности 2π. Можно назначить свойству значение, возвращаемое выражением 2*pi. MATLAB вычисляет функцию при первой загрузке класса.

Сведения о назначении значений свойств по умолчанию и значений атрибутов см. в следующих разделах.

Где использовать выражения в определениях классов

Вот несколько примеров выражений, используемых в определении класса:

classdef MyClass
   % Some attributes are set to logical values
   properties (Constant = true)
      CnstProp = 2*pi
   end
   properties
      % Static method of this class
      Prop1 = MyClass.setupAccount
      % Constant property from this class
      Prop2 = MyClass.CnstProp
      % Function that returns a value
      Prop3 = datestr(now)
      % A class constructor
      Prop4 = AccountManager
   end
   methods (Static)
      function accNum = setupAccount
         accNum = randi(9,[1,12]);
      end
   end
end

MATLAB не вызывает методы набора свойств при назначении результатов выражений значений по умолчанию свойствам. (Сведения об этих специальных методах см. в разделе Методы доступа к свойствам.)

Перечисления, полученные из типов MATLAB, могут использовать выражение для назначения значения:

classdef FlowRate < int32
   enumeration
      Low    (10)
      Medium (FlowRate.Low*5)
      High   (FlowRate.Low*10)
   end
end

MATLAB вычисляет эти выражения только один раз при первом обращении к членам перечисления.

Выражения в спецификациях атрибутов

Для логических значений атрибутов true или false, определения классов могут задавать значения атрибутов с помощью выражений. Например, это присвоение MyClass запечатано (не может быть подклассировано) для версий MATLAB перед R2014b (verLessThan)

classdef  (Sealed = verLessThan('matlab','8.4')) MyClass

Выражение в правой части знака равенства (=) должен вычислить true или false. В этом выражении нельзя использовать определения из файла класса, включая постоянные свойства, статические методы и локальные функции.

Хотя для задания значений атрибутов можно использовать условное выражение, это может привести к изменению определения класса на основе внешних условий. Убедитесь, что это поведение соответствует конструкции класса.

Примечание

AllowedSubclasses и InferiorClasses атрибуты требуют явной спецификации массива ячеек meta.class объекты как их значения. Для возврата этих значений нельзя использовать выражения.

Дополнительные сведения о синтаксисе атрибутов см. в разделе Спецификация атрибутов.

Выражения, задающие значения свойств по умолчанию

Определения свойств позволяют задавать значения по умолчанию для свойств, используя любое выражение, не имеющее ссылки на переменные. Например, VectorAngle определяет свойство константы (Rad2Deg) и использует его в выражении, определяющем значение по умолчанию другого свойства (Angle). В выражении значения по умолчанию также используется статический метод (getAngle) определяется классом:

classdef VectorAngle
   properties (Constant)
      Rad2Deg = 180/pi
   end
   properties
      Angle = VectorAngle.Rad2Deg*VectorAngle.getAngle([1 0],[0 1])
   end
   methods
      function obj = VectorAngle(vx,vy)
         obj.Angle = VectorAngle.getAngle(vx,vy);
      end
   end
   methods (Static)
      function r = getAngle(vx,vy)
         % Calculate angle between 2D vectors
         cr = vx(1)*vy(1) + vx(2)*vy(2)/sqrt(vx(1)^2 + vx(2)^2) * ...
            sqrt(vy(1)^2 + vy(2)^2);
         r = acos(cr);
      end
   end
end

Нельзя использовать входные переменные конструктора для определения значения по умолчанию Angle собственность. Например, это определение для Angle недопустимое свойство:

properties
      Angle = VectorAngle.Rad2Deg*VectorAngle.getAngle(vx,vy)
end

Попытка создания экземпляра приводит к ошибке:

a = VectorAngle([1,0],[0,1])
Error using VectorAngle
Unable to update the class 'VectorAngle' because the new definition contains an
error:
 Undefined function or variable 'vx'.

Выражения в методах классов

Выражение в методах класса выполняется подобно выражениям в любой функции. При выполнении метода MATLAB вычисляет выражение в рабочей области функции. Поэтому выражения, используемые в методах класса, не считаются частью определения класса и не рассматриваются в этом разделе.

Как MATLAB оценивает выражения

MATLAB вычисляет выражения, используемые в определении класса, без какой-либо рабочей области. Поэтому эти выражения не могут ссылаться на переменные любого типа.

MATLAB вычисляет выражения в контексте файла класса, поэтому эти выражения могут обращаться к любым функциям, статическим методам и постоянным свойствам других классов, которые находятся на вашем пути во время инициализации класса MATLAB. Выражения, определяющие значения свойств по умолчанию, могут обращаться к свойствам констант, определенным в собственном классе.

Когда MATLAB вычисляет выражения

MATLAB оценивает выражения в определениях классов только при инициализации класса. Инициализация выполняется перед первым использованием класса.

После инициализации значения, возвращаемые этими выражениями, являются частью определения класса и являются постоянными для всех экземпляров класса. Каждый экземпляр класса использует результаты начальной оценки выражений без повторной оценки.

Если очистить класс, MATLAB повторно инициализирует класс путем переоценки выражений, являющихся частью определения класса. (см. раздел Автоматическое обновление измененных классов)

Оценка выражения в классах дескрипторов и значений

В следующем примере показано поведение объекта value и handle при присвоении свойствам значений по умолчанию. Предположим, что у вас есть следующие классы.

Выражения в классах значений

ClassExp имеет свойство, содержащее ContClass объект:

classdef ContClass
   properties
      % Assign current date and time
      TimeProp = datestr(now) 
   end
end
classdef ClassExp
   properties
      ObjProp = ContClass
   end
end

При первом использовании ClassExp , MATLAB создает экземпляр ContClass класс. MATLAB инициализирует оба класса в это время. Все экземпляры ClassExp включить копию этого же экземпляра ContClass.

a = ClassExp;
a.ObjProp.TimeProp
ans =

08-Oct-2003 17:16:08

TimeProp имущества ContClass содержит дату и время, когда MATLAB инициализировал класс. Создание дополнительных экземпляров ClassExp класс показывает, что строка даты не изменилась:

b = ClassExp;
b.ObjProp.TimeProp
ans =

08-Oct-2003 17:16:08

Поскольку в этом примере используется класс значений для содержащегося объекта, каждый экземпляр ClassExp имеет собственную копию объекта. Например, предположим, что вы изменяете значение TimeProp свойство объекта, содержащегося в ClassExp объектb:

b.ObjProp.TimeProp = datestr(now)
ans =

08-Oct-2003 17:22:49

Копия объекта, содержащегося в объекте a неизменен:

a.ObjProp.TimeProp
ans =

08-Oct-2003 17:16:08

Выражения в классах дескрипторов

Теперь рассмотрим поведение, если содержащийся объект является объектом-дескриптором:

classdef ContClass < handle
   properties
      TimeProp = datestr(now)
   end
end

Создание двух экземпляров ClassExp класс показывает, что MATLAB создал объект при инициализации ContClass. MATLAB использовал копию дескриптора объекта для каждого экземпляра ClassExp класс. Поэтому есть один ContClass объект и ObjProp свойство каждого ClassExp объект содержит копию его дескриптора.

Создание экземпляра ClassExp и обратите внимание на время создания:

a = ClassExp;
a.ObjProp.TimeProp
ans =

08-Oct-2003 17:46:01

Создание второго экземпляра ClassExp класс. ObjProp содержит дескриптор того же объекта:

b = ClassExp;
b.ObjProp.TimeProp
ans =

08-Oct-2003 17:46:01

Переназначить значение содержащегося объекта TimeProp свойство:

b.ObjProp.TimeProp = datestr(now);
b.ObjProp.TimeProp
ans =

08-Oct-2003 17:47:34

ObjProp свойство объекта b содержит дескриптор для того же объекта, что и ObjProp свойство объекта a. Значение TimeProp для этого объекта также изменилось свойство:

a.ObjProp.TimeProp
ans =

08-Oct-2003 17:47:34

Связанные темы