Реализуйте интерфейс Set/Get для свойств

Стандартный интерфейс Set/Get

Некоторые MATLAB® объекты, такие как графические объекты, реализуют интерфейс, основанный на set и get функций. Эти функции обеспечивают доступ к нескольким свойствам для массивов объектов в одном вызове функции.

Можно добавить set и get функциональность вашего класса путем вывода из одного из следующих классов:

  • matlab.mixin.SetGet - используйте, когда требуется поддержка соответствия имен свойств без учета регистра. Получение из matlab.mixin.SetGet не влияет на точное имя свойства, требуемое при использовании ссылки записи через точку на свойства.

  • matlab.mixin.SetGetExactNames - используйте, когда необходимо поддержать только соответствие полного имени свойства с учетом регистра.

Примечание

The set и get методы, упомянутые в этом разделе, отличаются от методов доступа к набору свойств и доступа к свойствам. Смотрите Методы доступа к свойствам для получения информации о методах доступа к свойствам.

Синтаксис подкласса

Используйте абстрактный класс matlab.mixin.SetGet или matlab.mixin.SetGetExactNames как суперкласс:

classdef MyClass < matlab.mixin.SetGet
   ...
end

Потому что matlab.mixin.SetGet и matlab.mixin.SetGetExactNames выведите из handle класс, ваш подкласс также является handle класс.

Синтаксис метода Get

The get метод возвращает значение свойства объекта с помощью указателя на объект и имени свойства. Для примера примите H - указатель на объект:

v = get(H,'PropertyName');

Если вы задаете массив указателей с одним именем свойства, get возвращает значение свойства для каждого объекта как массив ячеек значений:

CV = get(H,'PropertyName');

The CV массив всегда является столбцом независимо от формы H.

Если вы задаете массив ячеек char имена свойства и массив указателей, get возвращает массив ячеек со значениями свойств. Каждая строка в камеру соответствует объекту в массиве указателей. Каждый столбец в камеру соответствует имени свойства.

props = {'PropertyName1','PropertyName2'};
CV = get(H,props);

get возвращает массив ячеек m на n, где m = length(H) и n = length(props).

Если вы задаете массив указателей, но нет имен свойства, get возвращает массив типа struct в котором каждая структура массива соответствует объекту в H. Каждое поле в каждой структуре соответствует свойству, заданному классом H. Значение каждого поля является значением соответствующего свойства.

SV = get(H);

Если вы не присваиваете переменный выход, то H должно быть скалярным.

Для получения примера смотрите Использование get with Arrays of Handles.

Синтаксис метода Set

The set метод присваивает заданное значение заданному свойству для объекта с указателем H. Если H является массивом указателей, MATLAB присваивает значение свойству для каждого объекта в массиве H.

set(H,'PropertyName',PropertyValue)

Можно передать массив ячеек с именами свойства и массив ячеек с значениями свойств в set:

props = {'PropertyName1','PropertyName2'};
vals = {Property1Value,Property2Value};
set(H,props,vals)

Если length(H) больше единицы, тогда массив ячеек значения свойства (vals) может иметь значения для каждого свойства в каждом объекте. Например, предположим length(H) Значение 2 (два указателя на объект). Вы хотите назначить два значения свойств для каждого объекта:

props = {'PropertyName1','PropertyName2'};
vals = {Property11Value,Property12Value;Property21Value,Property22Value};
set(H,props,vals))

Предыдущий оператор эквивалентен следующим двум заявлениям:

set(H(1),'PropertyName1',Property11Value,'PropertyName2',Property12Value)
set(H(2),'PropertyName1',Property21Value,'PropertyName2',Property22Value)

Если вы задаете скалярный указатель, но никаких имен свойства, set возвращает struct с одним полем для каждого свойства в классе H. Каждое поле содержит пустой массив ячеек.

SV = set(h);

Класс, производный от matlab.mixin.SetGet

Этот пример класса задает интерфейс set/get и иллюстрирует поведение унаследованных методов:

classdef LineType < matlab.mixin.SetGet
   properties
      Style = '-'
      Marker = 'o'
   end
   properties (SetAccess = protected)
      Units = 'points'
   end
   methods
      function obj = LineType(s,m)
         if nargin > 0
            obj.Style = s;
            obj.Marker = m;
         end
      end
      function set.Style(obj,val)
         if ~(strcmpi(val,'-') ||...
               strcmpi(val,'--') ||...
               strcmpi(val,'..'))
            error('Invalid line style ')
         end
         obj.Style = val;
      end
      function set.Marker(obj,val)
         if ~isstrprop(val,'graphic')
            error('Marker must be a visible character')
         end
         obj.Marker = val;
      end
   end
end

Создайте образец класса и сохраните его указатель:

h = LineType('--','*');

Запросите значение любого свойства объекта, используя унаследованное get метод:

get(h,'Marker')
ans =

'*'

Установите значение любого свойства, используя унаследованную set метод:

set(h,'Marker','Q')

Методы доступа к свойствам Вызываются с набором и получением

MATLAB вызывает методы доступа к свойствам (set.Style или set.Marker в LineType класс), когда вы используете set и get методы.

set(h,'Style','-.-')
Error using LineType/set.Style (line 20)
Invalid line style

Для получения дополнительной информации о методах доступа к свойствам смотрите Методы доступа к свойствам

Список всех свойств

Верните struct содержащие свойства объекта и их текущие значения с помощью get:

h = LineType('--','*');
SV = get(h)
SV = 

  struct with fields:

     Style: '--'
    Marker: '*'
     Units: 'points'

Верните struct содержащие свойства, которые public SetAccess использование set:

S = set(h)
S = 

  struct with fields:

     Style: {}
    Marker: {}

The LineType класс задает Units свойство с SetAccess = protected. Поэтому S = set(h) не создает поле для Units в S.

set невозможно вернуть возможные значения для свойств с непатентованным доступом к набору.

Использование get с массивами указателей

Предположим, что вы создаете массив LineType объекты:

H = [LineType('..','z'),LineType('--','q')]
H = 

  1x2 LineType with properties:

    Style
    Marker
    Units

Когда H - массив указателей, get возвращает a (length(H)-by-1) массив ячеек из значений свойств:

CV = get(H,'Style')
CV =

  2×1 cell array

    {'..'}
    {'--'}

Когда H является массивом указателей, и вы не задаете имя свойства, get возвращает struct массив, содержащий поля с именами, соответствующими именам свойства. Назначьте выход get в переменную при H не скаляром.

SV = get(H)
SV = 

2x1 struct array with fields:
    Style
    Marker
    Units

Получите значение Marker свойство от второго элемента массива в SV массив структур:

SV(2).Marker
ans =

'q'

Массивы указателей, имен и значений

Можно передать массив указателей, массив ячеек с именами свойства и массив ячеек с значениями свойств в set. Массив ячеек значения свойства должен иметь одну строку значений свойств для каждого объекта в H. Каждая строка должна иметь значение для каждого свойства в имя свойства массиве:

H = [LineType('..','z'),LineType('--','q')];
set(H,{'Style','Marker'},{'..','o';'--','x'})

Результат этого вызова на set является:

H(1)
ans = 

  LineType with properties:

     Style: '..'
    Marker: 'o'
     Units: 'points
H(2)
ans = 

  LineType with properties:

     Style: '--'
    Marker: 'x'
     Units: 'points'

Настройка списка свойств

Настройте отображение списков свойств путем переопределения следующих методов в подклассе:

  • setdisp - Когда вы звоните set без выходного аргумента и одинарного скалярного входа указателя, set вызывает setdisp для определения способа отображения списка свойств.

  • getdisp - Когда вы звоните get без выходного аргумента и одинарного скалярного входа указателя, get вызывает getdisp для определения способа отображения списка свойств.

Установите приоритет для соответствия частичных Имен свойства

Классы, которые получают от matlab.mixin.SetGet может использовать PartialMatchPriority атрибут свойства, чтобы задать относительный приоритет для частичного соответствия имен. MATLAB применяет этот атрибут при разрешении неполных и без учета регистра текстовых строк, которые совпадают с более чем одним именем свойства.

Унаследованный set и get методы могут разрешать неточные имена свойства, когда нет неоднозначностей, возникающих из-за неточных строк имен. Когда частичное имя свойства неоднозначно, потому что имя соответствует более чем одному свойству, PartialMatchPriority значение атрибута может определить, какое свойство MATLAB соответствует.

Приоритет по умолчанию эквивалентен PartialMatchPriority = 1. Чтобы уменьшить относительный приоритет свойства, задайте PartialMatchPriority в положительное целое значение 2 или больше. Приоритет свойства уменьшается по мере того, как значение PartialMatchPriority увеличивается.

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

classdef MyClass < matlab.mixin.SetGet
    properties
        Verbosity
    end
    properties (PartialMatchPriority = 2)
        Version
    end
end

Вызов set метод с потенциально неоднозначным неточным именем Ver устанавливает Verbosity свойство из-за его более высокого относительного приоритета. Не устанавливая PartialMatchPriority атрибут, неоднозначное имя вызовет ошибку.

a = MyClass;
set(a,"Ver",10)
disp(a)
 MyClass with properties:

    Verbosity: 10
      Version: []

Выбор того же имени применяется к get способ.

v = get(a,"Ver")
v =

    10 

Соответствие регистров и имен

Полное имя, совпадающее с несоответствующим случаем, имеет приоритет над частичным соответствием со свойством более высокого приоритета. Для примера этот класс задает BaseLine свойство с приоритетом 1 (по умолчанию) и Base свойство с приоритетом 2 (ниже 1).

classdef MyClass < matlab.mixin.SetGet
    properties
        BaseLine
    end
    properties (PartialMatchPriority = 2)
        Base
    end
end

Вызов set метод со строкой base устанавливает Base свойство. BaseLine имеет более высокий приоритет, но полное имя соответствует неправильному случаю имеет приоритет.

a = MyClass;
set(a,"base",-2)
disp(a)
 MyClass with properties:

    BaseLine: []
        Base: -2

Уменьшите несовместимость при добавлении новых свойств

Можно использовать PartialMatchPriority атрибут, чтобы избежать введения несовместимости кода при добавлении нового свойства. Для примера этот класс включает set и get методы для обращения к Distance свойство со строковой Dis потому что DiscreteSamples свойство имеет более низкий приоритет.

classdef Planet < matlab.mixin.SetGet
% Version 1.0
    properties
        Distance
    end
    properties(PartialMatchPriority = 2)
        DiscreteSamples
    end
end

Версия 2.0 класса вводит свойство с именем Discontinuities. Чтобы предотвратить возможность возникновения неоднозначного частичного имени свойства в существующем коде, используйте PartialMatchPriority задать приоритет Discontinuities ниже, чем у ранее существующих свойств.

classdef Planet < matlab.mixin.SetGet
% Version 2.0
    properties
        Diameter;
        NumMoons = 0
        ApparentMagnitude;
        DistanceFromSun;
    end
    properties(PartialMatchPriority = 2)
        DiscreteSamples;
    end
    properties(PartialMatchPriority = 3)
        Discontinuities = false;
    end
end

Для версии 1.0 Planet класс, этот вызов к set метод не был неоднозначным.

p = Planet;
set(p,"Disc",true)

Однако с введением Discontinuities свойство, строка Disc становится неоднозначным. Отдавая Discontinuities свойство меньшего приоритета, строка Disc продолжает совпадать с DiscreteSamples свойство.

Примечание

При записи переиспользуемого кода использование полных, учитывающих регистр имен свойства избегает неоднозначностей, предотвращает несовместимость с последующими релизами ПО и создает более читаемый код.

См. также

| | |

Похожие темы