MATLAB® применяет любой класс и валидацию размера, заданную для свойства прежде, чем вызвать функции валидации. Присвоение на свойство, которое задает размер или валидацию класса, походит на присвоение на объектный массив MATLAB. MATLAB может применить класс и преобразования размера в правую сторону присвоения, чтобы удовлетворить валидация размера и класс.
Для получения дополнительной информации смотрите Порядок Валидации и Функций проверки свойств.
Задайте размер свойства как строку, столбец и дополнительную размерность после имени свойства.
classdef MyClass properties Prop(dim1,dim2,...) = defaultValue end end
Этот класс задает размер Location
свойство как 1 3. Любое значение, присвоенное этому свойству, должно соответствовать тому размеру или должно быть конвертируемым к тому размеру.
classdef ValidateProps properties Location(1,3) end end
Неявное значение по умолчанию присвоено MATLAB, [0 0 0]
, соответствует заданному размеру:
a = ValidateProps
a = ValidateProps with properties: Location: [0 0 0]
MATLAB применяет скалярное расширение, когда вы присваиваете скаляр Location
свойство.
a = ValidateProps; a.Location = 1
a = ValidateProps with properties: Location: [1 1 1]
MATLAB преобразует столбцы в строки, чтобы совпадать со спецификацией размера:
col = [1;1;1]
col = 1 1 1
a.Location = col
a = ValidateProps with properties: Location: [1 1 1]
Двоеточие в спецификации размера указывает, что соответствующая размерность может иметь любую длину. Например, можно присвоить значение любой длины к Label
свойство в этом классе.
classdef ValidateProps properties Label(1,:) end end
a = ValidateProps;
a.Label = 'Click to Start'
a = ValidateProps with properties: Label: 'Click to Start'
Присвоение на свойство, которое задает валидацию размера, следует тем же правилам как эквивалентное присвоение индексного массива. Для получения информации об индексации поведения многомерных массивов смотрите Совместимые Размеры Массивов для Основных Операций.
Определение класса свойства может уменьшать потребность протестировать значения, присвоенные свойству в вашем коде. Любое значение, присвоенное свойству, должно иметь заданный класс или конвертируемо к заданному классу.
Можно задать только один класс на свойство. Используйте функции валидации как mustBeNumeric
или mustBeInteger
ограничить свойства более широкой категорией классов. Для получения дополнительной информации о функциях валидации см. Функции проверки свойств.
Можно использовать любой класс MATLAB или внешне заданный класс, который поддерживается MATLAB, кроме Java® и COM-классы.
Поместите имя класса в блоке определения свойства после имени свойства и дополнительной спецификации размера.
classdef MyClass properties Prop ClassName = defaultValue end end
Если вы не задаете значение по умолчанию, MATLAB присваивает пустой объект заданного класса к свойству. Если вы задаете размер и класс, MATLAB пытается создать значение по умолчанию для свойства, которое удовлетворяет и размеру и требованию класса.
MATLAB создает значение по умолчанию путем вызова конструктора класса без аргументов. Класс должен иметь конструктора, который возвращает объект заданного размера, когда названо без входных параметров, или необходимо задать значение по умолчанию для свойства, которое удовлетворяет ограничению размера свойства. Для получения дополнительной информации смотрите Значения по умолчанию На Размер и Класс.
PropsWithClass
класс задает два свойства с определениями классов:
Number
— Значения должны иметь класс double
или конвертируемый к double
.
Today
— Значения должны иметь класс char
или конвертируемый к char
. Значением по умолчанию является char
вектор, возвращенный date
функция.
classdef PropsWithClass properties Number double Today char = date end end
Создайте объект PropsWithClass
класс.
p = PropsWithClass
p = PropsWithClass with properties: Number: [] Today: '10-Sep-2016'
MATLAB выполняет преобразования от любого совместимого класса до класса свойства. Например, присвойте a datetime
массив к Today
свойство.
p.Today = [datetime('now'),datetime('tomorrow')]; disp(class(p.Today))
ans = char
Поскольку datetime
класс имеет char
конвертер, можно присвоить datetime
массив к Today
свойство.
Присвоение несовместимого значения к свойству, которое использует валидацию класса, вызывает ошибку.
p.Number = datetime('now');
Error setting property 'Number' of class 'PropsWithClass':
Invalid data type. Value must be double or be convertible to double.
Можно задать класс, чтобы управлять значениями, присвоенными свойству. Классы перечисления позволяют пользователям установить значения свойств на векторы символов или строковые скаляры с неточным соответствием имени.
Например, предположите, что существует класс, который представляет механический насос с тремя скоростями. Можно задать класс перечисления, чтобы представлять эти три скорости потока жидкости.
classdef FlowRate < int32 enumeration Low (10) Medium (50) High (100) end end
Pump
класс имеет метод, чтобы возвратить уровень электрического тока в галлонах в минуту. Задайте Speed
свойство как FlowRate
класс.
classdef Pump properties Speed FlowRate end methods function getGPM(p) if isempty(p.Speed) gpm = 0; else gpm = int32(p.Speed); end fprintf('Flow rate is: %i GPM\n',gpm); end end end
Пользователи могут установить Speed
свойство с помощью неточного текста.
p = Pump;
p.Speed = 'm'
p = Pump with properties: Speed: Medium
Численное значение доступно из свойства.
getGPM(p)
Flow rate is: 50 GPM
Для получения информации о классах перечисления смотрите, Задают Классы Перечисления.
MATLAB поддерживает несколько целочисленных классов (см. Целые числа). Однако ограничение свойства к целочисленному классу может привести к целочисленному переполнению. Получившееся значение может насыщать в максимальном или минимальном значении в области значений целого числа.
Когда целочисленное переполнение происходит, значение, которое присвоено свойству, может быть значением, которое отличается от значения с правой стороны оператора присваивания.
Например, предположите, что вы хотите ограничить значение свойства скаляром uint8
.
classdef IntProperty properties Value(1,1) uint8 end end
Присвоение числового значения к Value
свойство эффективно бросает числовое значение к uint8
, но не приводит к ошибке для значений из области значений.
a = IntProperty; a.Value = -10; disp(a.Value)
0
Присвоение на Value
свойство эквивалентно индексируемому присвоению массива. Если присвоенное значение вне области значений значений что uint8
может представлять, MATLAB устанавливает значение к самому близкому значению, что это может представлять использование uint8
.
a = uint8.empty; a(1) = -10
a = uint8 0
Чтобы избежать потенциала для целочисленного переполнения, используйте комбинацию функций валидации, которые ограничивают значение намеченной областью значений вместо целочисленного класса.
classdef IntProperty properties Value(1,1) {mustBeInteger, mustBeNonnegative,... mustBeLessThan(Value,256)} end end
Поскольку нет никакого преобразования присвоенного значения uint8
класс, блоки проверки допустимости отлавливают из значений области значений и выдают соответствующую ошибку.
a = IntProperty; a.Value = -10;
Error setting property 'Value' of class 'IntProperty':
Value must be nonnegative.
Любое значение свойства по умолчанию, которое вы присваиваете в определении класса, должно соответствовать заданной валидации.
MATLAB задает значение по умолчанию неявно, если вы не задаете значение по умолчанию в определении класса. Эта таблица показывает, как размер и класс определяют неявное значение по умолчанию классов MATLAB.
Размер | Класс | Неявное значение по умолчанию, присвоенное MATLAB |
---|---|---|
| Любой числовой | массив m на n нулей заданного класса. |
| Любой класс | m-0 или 0 n заданного класса. |
|
| массив символов m на n пробелов. |
|
| массив ячеек m на n с каждой ячейкой, содержащей 0 на 0 дважды. |
|
| m на n |
|
| m на n |
| класс перечисления | Первый член перечисления задан в классе. |
(1,1) |
| Ошибка периода выполнения — задает значение по умолчанию в классе. |
Чтобы определить неявное значение по умолчанию для ненулевых и явных технических требований размера, MATLAB вызывает конструктора класса по умолчанию и создает массив заданного размера с помощью экземпляра, возвращенного вызовом конструктора. Если класс не поддерживает конструктора по умолчанию (то есть, конструктор вызвал без аргументов), то MATLAB выдает ошибку при инстанцировании класса, содержащего валидацию.
Если заданный размер имеет какой-либо нуль или неограниченный (:
) размерности, MATLAB создает значение по умолчанию, которое является пустым массивом с неограниченной обнуленной размерностью.
Для разнородных массивов MATLAB вызывает getDefaultScalarElement
метод, чтобы получить объект по умолчанию.