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