Оценка выражений в определениях классов

Почему выражения использования

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

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

Выражения в Классах Handle

Теперь рассмотрите поведение, если содержащий в нем объект является объектом указателя:

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

Похожие темы

Для просмотра документации необходимо авторизоваться на сайте