exponenta event banner

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

Стандартный интерфейс набора/получения

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

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

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

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

Примечание

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

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

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

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

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

Получить синтаксис метода

get возвращает значение свойства объекта, используя дескриптор объекта и имя свойства. Например, предположим, что H является дескриптором объекта:

v = get(H,'PropertyName');

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

CV = get(H,'PropertyName');

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

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

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

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

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

SV = get(H);

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

Пример см. в разделе Использование get с массивами дескрипторов.

Задать синтаксис метода

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')

Методы доступа к свойствам, вызываемые с помощью set и get

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

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

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

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

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

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

  struct with fields:

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

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

S = set(h)
S = 

  struct with fields:

     Style: {}
    Marker: {}

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 собственность.

Примечание

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

См. также

| | |

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