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

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

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

Похожие темы

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