exponenta event banner

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

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

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

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

Любой класс

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

(m,n)

char

m-на-n символьный массив пробелов.

(m,n)

cell

Массив ячеек m-by-n с каждой ячейкой, содержащей двойную ячейку 0-by-0.

(m,n)

struct

m-by-n struct

(m,n)

string

m-by-n string

(m,n)

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

Первый элемент перечисления, определенный в классе.

(1,1)

function_handle

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

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

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

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

Связанные темы