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