Определение свойства

Что можно определить

Управление аспектами определений свойств следующими способами:

Примечание

Свойства не могут иметь то же имя, что и класс.

Примечание

Всегда используйте учитывающие регистр имена свойства в MATLAB® код.

Инициализация значений свойств

Существует два основных подхода к инициализации значений свойств:

  • В определении свойства - MATLAB оценивает выражение только один раз и присваивает то же значение свойству каждого образца.

  • В конструкторе классов - MATLAB оценивает выражение назначения для каждого образца, которое гарантирует, что каждый образец имеет уникальное значение.

Для получения дополнительной информации об оценке выражений, которые вы присваиваете как значения свойства по умолчанию, см. Когда MATLAB определяет значение выражения.

Значения свойства по умолчанию

В пределах properties блок, можно управлять значением по умолчанию отдельного свойства. Назначьте значения по умолчанию в виде значений или выражений MATLAB. Выражения не могут ссылаться на переменные. Для примера:

  • Prop1 - Никакое назначение не приводит к пустым [] значение по умолчанию

  • Prop2 - Назначьте символьный массив значением по умолчанию

  • Prop3 - Присвойте результат выражения значению по умолчанию

  • Prop4 - Назначить пустой datetime объект к Prop4

  • Prop5 - Присвойте значение по умолчанию, которое удовлетворяет заданным ограничениям скалярного положительного двойника.

classdef ClassName
   properties
      Prop1
      Prop2 = 'some text'
      Prop3 = sin(pi/12)
      Prop4 = datetime.empty 
      Prop5 (1,1) double {mustBePositive} = 1
   end
end

Если определение класса не задает значение свойства по умолчанию, MATLAB инициализирует значение свойства в пустое double ([]). Если класс задает какие-либо ограничения класса, размера или функции валидации значения свойства, то класс должен убедиться, что значение по умолчанию удовлетворяет этим ограничениям, присвоив допустимое значение, когда пустое значение недопустимо.

Примечание

Оценка значений свойства по умолчанию происходит только тогда, когда значение сначала необходимо, и только один раз, когда MATLAB впервые инициализирует класс. MATLAB не переоценивает выражение при каждом создании образца класса.

Для получения дополнительной информации об оценке выражений, которые вы присваиваете в качестве значений свойства по умолчанию, смотрите Оценка выражений в определениях классов и Свойства, содержащие объекты.

Для получения информации о функциях класса, размера и валидаций, используемых в определениях свойств, см. «Валидация значений свойств».

Инициализация свойств для обработки объектов

MATLAB присваивает заданные значения по умолчанию свойствам только один раз, когда MATLAB загружает определение класса. Если вы используете конструктор класса handle для создания значения свойства по умолчанию, MATLAB вызывает конструктор только тогда, когда класс сначала используется, а затем использует тот же указатель на объект, что и по умолчанию для свойства во всех созданных объектах. Поскольку все указатели на объекты ссылаются на один и тот же объект, все изменения, которые вы вносите в объект-указатель в одном образце, вносятся в объект-указатель во всех образцах.

Если вы хотите, чтобы значение свойства было инициализировано новому образцу объекта указателя каждый раз, когда вы создаете объект вашего класса, присвойте значение свойства в конструкторе.

Присвоение значений свойств в конструкторе

Чтобы назначить значения свойству из конструктора классов, обратитесь к объекту, который возвращает конструктор (переменный выход obj) и имя свойства с помощью записи через точку:

classdef MyClass
   properties
      Prop1
   end
   methods
      function obj = MyClass(intval)
         % Initialize Prop1 for each instance
         obj.Prop1 = intval;
      end
   end
end

При назначении свойства в конструкторе классов MATLAB оценивает оператор назначения для каждого созданного объекта. Назначьте значения свойств в конструкторе, если необходимо, чтобы каждый объект содержал уникальное значение для этого свойства.

Для примера предположим, что вы хотите назначить уникальный указатель объект свойству другого объекта каждый раз, когда вы создаете один из других объектов. Присвойте объект указатель свойству в конструкторе. Вызовите конструктор объекта указатель, чтобы создать уникальный объект указатель с каждым образцом вашего класса.

classdef ContainsHandle
   properties
       Prop1
   end
   methods
       function obj = ContainsHandle(keySet,valueSet)
           obj.Prop1 = MyHandleClass(keySet,valueSet);
       end
   end
end

Для получения дополнительной информации о методах конструктора см. Раздел «Ссылки на объект в конструкторе».

Значения по умолчанию, рассчитанные перед созданием объекта

MATLAB проверяет значения свойства по умолчанию перед назначением значений в конструкторе. Это необходимо для значения по умолчанию, присвоенного в properties блок и значение свойства, установленное в конструкторе классов, чтобы удовлетворить указанной валидации. Для примера этот класс ограничивает Prop Скаляр положительное двойное число, но не присваивает допустимое значение по умолчанию. По умолчанию MATLAB присваивает значение по умолчанию пустой двойной точности, что вызывает ошибку времени выполнения.

classdef PropInit
    properties
        % Error without valid default value
        Prop (1,1) double {mustBePositive} 
        % Empty default fails mustBePositive
    end
    methods
        function obj = PropInit(positiveInput)
            obj.Prop = positiveInput;
        end
    end
end

Вызов конструктора классов с допустимым значением для Prop Результаты ошибку из функции валидации mustBePositive.

obj = PropInit(2);
Error using implicit default value of property 'Prop' of class 'PropInit':
Value must be positive.

Атрибуты свойств

Все свойства имеют атрибуты, которые изменяют определенные аспекты поведения свойства. Указанные атрибуты применяются ко всем свойствам в конкретном блоке свойств. Для примера:

classdef ClassName
   properties (PropertyAttribute = value)
      Prop1
      Prop2
   end
end

Для примера только методы из одного и того же определения классов могут изменять и запрашивать Salary и Password свойства.

classdef EmployeeInfo
   properties (Access = private)
      Salary
      Password
   end
end

Это ограничение существует, потому что класс задает эти свойства в properties блок со Access для атрибута задано значение private.

Атрибуты свойств

Описание атрибутов свойств, которые можно задать, см. в разделе «Атрибуты свойств».

Методы для задания и получения значений свойств

MATLAB вызывает каждый раз, когда устанавливает или запрашивает значение свойства. Задайте доступ к набору свойств или получите методы доступа в methods блоки, которые не задают атрибуты и имеют следующий синтаксис:

methods

   function obj = set.PropertyName(obj,value)
      ...
   end

   function value = get.PropertyName(obj)
      ...
   end

end

Для получения дополнительной информации о синтаксисе метода доступа смотрите Методы получения свойств и Методы набора свойств.

MATLAB не вызывает метод доступа к набору свойств при назначении значения по умолчанию, заданного в блоке определения свойства.

Для примера, set.Password метод проверяет длину символьного массива, назначенного свойству с именем Password. Если в значении, присвоенном свойству, меньше семи символов, MATLAB возвращает ошибку. В противном случае MATLAB присваивает заданному значению.

function obj = set.Password(obj,pw)
   if numel(pw) < 7
      error('Password must have at least 7 characters')
   else
      obj.Password = pw;
end

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

Ссылка на свойства объекта с помощью переменных

MATLAB может разрешить имя свойства из char переменная с использованием выражения формы:

object.(PropertyNameVar)

где PropertyNameVar - переменная, содержащая имя допустимого свойства объекта. Используйте этот синтаксис при передаче имен свойства в качестве аргументов. Например, функция getPropValue возвращает значение KeyType свойство:

PropName = 'KeyType';
function o = getPropValue(obj,PropName)
   o = obj.(PropName);
end

Похожие темы