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