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

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

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

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

Примечание

The 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 повторно инициализирует класс, переоценив выражения, которые являются частью определения класса. (см. «Автоматическое обновление модифицированных классов»)

Оценка выражения в классах Handle и Value

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

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

The 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

The 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

Выражения в классах Handle

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

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 класс. The 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

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

a.ObjProp.TimeProp
ans =

08-Oct-2003 17:47:34

Похожие темы