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

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

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

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

Любой класс

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

(m,n)

char

массив символов m на n пробелов.

(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 метод, чтобы получить объект по умолчанию.

Похожие темы