Валидация свойства MATLAB® позволяет вам установить определенные ограничения для значений свойств. Можно использовать валидацию, чтобы ограничить класс и размер значений свойств. Кроме того, можно использовать функции, чтобы установить критерии, которым должно соответствовать значение свойства. MATLAB задает набор функций валидации, и можно записать собственные функции валидации.
Использование валидации свойства является дополнительным в определениях классов.
Для получения дополнительной информации о валидации свойства смотрите Валидацию Класса и Размера Свойства, Функции проверки свойств и Интерфейс Метаданных к Валидации Свойства.
Подсвеченная область в следующем коде показывает синтаксис для валидации свойства.
Валидация свойства включает любое следующее:
Размер — длина каждой размерности в виде положительного целого числа или двоеточия. Двоеточие указывает, что любая длина позволена в той размерности. Значение, присвоенное свойству, должно соответствовать заданному размеру или быть совместимо с заданным размером. Для получения дополнительной информации смотрите Валидацию Размера Свойства.
Класс — имя одного класса MATLAB. Значение, присвоенное свойству, должно иметь заданный класс или конвертируемо к заданному классу. Используйте любой класс MATLAB или внешне заданный класс, который поддерживается MATLAB, за исключением Java® и COM-классов. Для получения дополнительной информации смотрите Валидацию Класса Свойства.
Функции — список, разделенный запятыми имен функций валидации. MATLAB передает значение, присвоенное свойству каждому функции валидации после применения любого возможного класса и преобразований размера. Блок проверки допустимости функционирует ошибки броска, если валидация перестала работать, но не делайте возвращаемых значений. Для получения дополнительной информации см. Функции проверки свойств.
Для списка функций валидации MATLAB см. Функции проверки свойств.
Используйте валидацию свойства для публичных свойств, чтобы управлять пользовательскими присвоениями значений кода к свойствам.
Если вы хотите ограничить значения свойств фиксированным набором идентификаторов, создать класс перечисления для этих идентификаторов и ограничить свойство к этому классу. Для получения информации о классах перечисления смотрите, Задают Классы Перечисления.
Правила преобразования типов MATLAB применяются к валидации свойства. Например, MATLAB может принудить от одного до другого числового типа. Поэтому ограничивание значения свойства к определенному числовому типу, такой как дважды не предотвращает присвоение других числовых типов к свойству.
Чтобы гарантировать, что свойство может быть присвоено только определенный тип значения, ограничьте свойство типом, который поддерживает только желаемые преобразования типов, или используйте функцию валидации, чтобы указать, что точный класс допускал свойство вместо того, чтобы задать тип свойства. MATLAB выполняет спецификацию типа прежде, чем выполнить любые функции валидации. Для получения дополнительной информации смотрите Порядок Валидации.
Убедитесь, что любое значение по умолчанию, присвоенное свойству, соответствует ограничениям, введенным заданной валидацией. Если вы не задаете значение по умолчанию, MATLAB создает значение по умолчанию путем присвоения пустого объекта заданного класса или путем вызова конструктора по умолчанию, если ограничение размера не позволяет использование пустого значения по умолчанию. Конструктор по умолчанию должен возвратить объект правильного размера.
ValidateProps
класс задает три свойства с валидацией.
classdef ValidateProps properties Location(1,3) double {mustBeReal, mustBeFinite} Label(1,:) char {mustBeMember(Label,{'High','Medium','Low'})} = 'Low' State(1,1) matlab.lang.OnOffSwitchState end end
Location
должен быть 1 3 массив класса double
чьи значения являются действительными, конечными числами.
Label
должен быть char
вектор, который является любой 'High'
Средняя
, или 'Low'
.
State
должен быть член перечисления matlab.lang.OnOffSwitchState
класс (off
или on
).
Создание объекта ValidateProps
класс выполняет валидацию на неявных и явных значениях по умолчанию:
a = ValidateProps
a = ValidateProps with properties: Location: [0 0 0] Label: 'Low' State: off
При создании объекта, MATLAB:
Инициализирует Location
значение свойства к [0 0 0]
удовлетворить требования класса и размер.
Устанавливает Label
свойство к его значению по умолчанию, 'Low'
. Значением по умолчанию должен быть член позволенного множества значений. Пустой char
неявное значение по умолчанию вызвало бы ошибку.
Устанавливает State
свойство к off
член перечисления задан matlab.lang.OnOffSwitchState
класс.
Для получения информации о том, как MATLAB выбирает значения по умолчанию, смотрите Значения по умолчанию На Размер и Класс.
Когда значение присвоено свойству, включая значения по умолчанию, которые заданы в определении класса, MATLAB выполняет валидацию в этом порядке:
Валидация класса — Эта валидация может вызвать преобразование в различный класс, такой как преобразование char
к string
. Присвоение на свойства следует правилам преобразования MATLAB для массивов.
Валидация размера — Эта валидация может вызвать преобразование размера, такое как скалярное расширение или преобразование вектор-столбца к вектору-строке. Присвоение на свойство, которое задает валидацию размера, ведет себя то же самое как присвоение на любой массив MATLAB. Для получения информации об индексируемом присвоении смотрите Индексацию массива.
Функции блока проверки допустимости — MATLAB передает результат класса и валидации размера к каждой функции валидации в левом к правильному порядку. Ошибка может произойти, прежде чем все функции валидации были вызваны, который заканчивает процесс валидации.
Метод установки — MATLAB выполняет валидацию свойства прежде, чем вызвать метод набора свойств, если вы заданы для того свойства. Присвоение на свойство в наборе свойств или добирается, метод не применяет валидацию снова. Часто, можно заменить валидацию свойства использования методов набора свойств.
ValueProp
класс использует размер, класс и функциональную валидацию, чтобы гарантировать что присвоение на Value
свойство является двойным скаляром, который не отрицателен.
classdef ValueProp properties Value(1,1) double {mustBeNonnegative} = 0 end end
Этот оператор пытается присвоить массив ячеек свойству. Это присвоение нарушает валидацию класса.
a.Value = {10,20};
Error setting property 'Value' of class 'ValueProp':
Invalid data type. Value must be double or be convertible to double.
Этот оператор пытается присвоить 1 2 двойной массив свойству. Это присвоение нарушает валидацию размера.
a.Value = [10 20];
Error setting property 'Value' of class 'ValueProp':
Size of value must be scalar.
Этот оператор пытается присвоить скаляр, вдвое больший по сравнению со свойством. Это присвоение приводит к сбою функциональную валидацию, которая требует неотрицательного номера.
a.Value = -10;
Error setting property 'Value' of class 'ValueProp':
Value must be nonnegative.
Процесс валидации заканчивается первой ошибкой, с которой сталкиваются.
Вы можете валидация свойства define для абстрактных свойств. Валидация применяется ко всем подклассам, которые реализуют свойство. Однако подклассы не могут использовать валидацию на своей реализации свойства. При наследовании валидации для свойства от нескольких классов только одно свойство Abstract в одном суперклассе может задать валидацию. Ни один из суперклассов не может задать свойство как некраткий обзор.
Если вы изменяете валидацию свойства, в то время как объекты класса существуют, MATLAB не пытается применить новую валидацию к существующим значениям свойств. Однако MATLAB действительно применяет новую валидацию, когда вы делаете присвоения на свойства существующих объектов.
При сохранении объекта в MAT
файл, MATLAB сохраняет все значения свойств не по умолчанию с объектом. При загрузке объекта MATLAB восстанавливает эти значения свойств в недавно созданном объекте.
Если определение класса изменяет валидацию свойства, таким образом, что загруженное значение свойства больше не действительно, MATLAB заменяет в настоящее время заданным значением по умолчанию то свойство. Однако load
функция подавляет ошибки валидации, которые происходят прежде, чем присвоить значение по умолчанию от текущего определения класса. Поэтому ошибки валидации тихо проигнорированы во время операций загрузки.
Чтобы проиллюстрировать это поведение, этот пример создает, сохраняет и загружает объект MonthTemp
класс. Этот класс ограничивает AveTemp
свойство к массиву ячеек.
classdef MonthTemp properties AveTemp cell end end
Создайте MonthTemp
возразите и присвойте значение AveTemp
свойство.
a = MonthTemp;
a.AveTemp = {'May',70};
Сохраните объектное использование save
.
save TemperatureFile a
Отредактируйте определение свойства, чтобы изменить класс валидации для AveTemp
свойство от массива ячеек до containers.Map
.
classdef MonthTemp properties AveTemp containers.Map end end
Загрузите сохраненный объект с новым определением класса на пути MATLAB. MATLAB не может присвоить сохраненное значение AveTemp
свойство, потому что массив ячеек, {'May',70}
, не совместимо с текущим требованием, чтобы значением свойства был containers.Map
объект. MATLAB не может преобразовать массив ячеек в containers.Map
.
Чтобы обратиться к несовместимости, MATLAB устанавливает AveTemp
свойство загруженного объекта к текущему значению по умолчанию, которое является пустым containers.Map
объект.
load TemperatureFile a a.AveTemp ans = Map with properties: Count: 0 KeyType: char ValueType: any
Загруженному объекту присвоили различное значение AveTemp
свойство, потому что сохраненное значение теперь недопустимо. Однако процесс загрузки подавляет ошибку валидации.
Чтобы предотвратить потерю данных при изменении определений классов и перезагрузке объектов, реализуйте a loadobj
метод или метод конвертера класса, который позволяет сохраненным значениям удовлетворить текущей валидации свойства.
Для получения дополнительной информации о сохранении и загружаемых объектах, смотрите, Сохраняют и Процесс Загрузки для Объектов.