Выражение, используемое в определении класса, может быть любым допустимым 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