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