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