Некоторые 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 класс.
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.
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);
Этот пример класса задает интерфейс 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: '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