Некоторые 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: '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
свойство.
Примечание
При записи переиспользуемого кода использование полных, учитывающих регистр имен свойства избегает неоднозначностей, предотвращает несовместимость с последующими релизами ПО и создает более читаемый код.
get
| matlab.mixin.SetGet
| matlab.mixin.SetGetExactNames
| set