Некоторые объекты 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);
Этот образец класса определяет интерфейс 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Дополнительные сведения о методах доступа к свойствам см. в разделе Методы доступа к свойствам
Вернуть 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: 'pointsH(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 собственность.
Примечание
При написании многократно используемого кода, используя полные, чувствительные к регистру имена свойств избегают неоднозначностей, предотвращают несовместимость с последующими выпусками программного обеспечения и создают более читаемый код.
get | matlab.mixin.SetGet | matlab.mixin.SetGetExactNames | set