Класс и размер Валидации

Класс и размер свойств

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-на-n массив нулей заданного класса.

(m,:) или (:,n)

Любой класс

m-на-0 или 0 на-n заданного класса.

(m,n)

char

m-на-n char массив пространств.

(m,n)

cell

m-на-n массив ячеек с каждой камерой, содержащей двойной коэффициент 0 на 0.

(m,n)

struct

m-на-n struct

(m,n)

string

m-на-n string

(m,n)

класс перечисления

Первый представитель перечисления, заданный в классе.

(1,1)

function_handle

Ошибка во время выполнения - задайте значение по умолчанию в классе.

Чтобы определить неявное значение по умолчанию для ненулевых и явных спецификаций размера, MATLAB вызывает конструктор классов по умолчанию и создает массив заданного размера с помощью образца, возвращенного вызовом конструктора. Если класс не поддерживает конструктор по умолчанию (то есть конструктор, вызываемый без аргументов), то MATLAB выдает ошибку при создании экземпляра класса, содержащего валидацию.

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

Для разнородных массивов MATLAB вызывает getDefaultScalarElement метод для получения объекта по умолчанию.

Похожие темы

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