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 создает значение по умолчанию, вызывая конструктор классов без аргументов. Класс должен иметь конструктор, который возвращает объект заданного размера при вызове без входных параметров, или необходимо задать значение по умолчанию для свойства, которое удовлетворяет ограничению размера свойства. Для получения дополнительной информации смотрите Значения по умолчанию для размера и класса.
The 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
The 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 char массив пространств. |
|
| m-на-n массив ячеек с каждой камерой, содержащей двойной коэффициент 0 на 0. |
|
| m-на-n |
|
| m-на-n |
| класс перечисления | Первый представитель перечисления, заданный в классе. |
|
| Ошибка во время выполнения - задайте значение по умолчанию в классе. |
Чтобы определить неявное значение по умолчанию для ненулевых и явных спецификаций размера, MATLAB вызывает конструктор классов по умолчанию и создает массив заданного размера с помощью образца, возвращенного вызовом конструктора. Если класс не поддерживает конструктор по умолчанию (то есть конструктор, вызываемый без аргументов), то MATLAB выдает ошибку при создании экземпляра класса, содержащего валидацию.
Если заданный размер имеет любой нуль или неограниченный (:
) размерности, MATLAB создает значение по умолчанию, которое является пустым массивом с неограниченным размером, установленным на нуле.
Для разнородных массивов MATLAB вызывает getDefaultScalarElement
метод для получения объекта по умолчанию.