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

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

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

Похожие темы