Некоторый 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 на n, where m = length(H)
и n = length(props)
.
Если вы задаете массив указателя, но никакие имена свойства, get
возвращает массив типа struct
в котором каждая структура в массиве соответствует объекту в H
. Каждое поле в каждой структуре соответствует свойству, заданному классом H
. Значение каждого поля является значением соответствующего свойства.
SV = get(H);
Если вы не присваиваете выходную переменную, то H
должен быть скаляр.
Для примера смотрите Используя, добираются с Массивами Указателей.
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);
Этот демонстрационный класс задает установить/получить интерфейс и иллюстрирует поведение унаследованных методов:
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: {}
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
возвращается (length(H)
- 1) массив ячеек значений свойств:
CV = get(H,'Style')
CV = 2×1 cell array {'..'} {'--'}
Когда H
массив указателей, и вы не задаете имя свойства, get
возвращает struct
массив, содержащий поля с именами, соответствующими PropertyName. Присвойте выход 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
свойство.
Примечание
Когда запись повторно используемого кода, использование полных, чувствительных к регистру имен свойства избегают неоднозначностей, предотвращают несовместимости с последующими релизами программного обеспечения и производят больше читаемого кода.
set
| get
| matlab.mixin.SetGet
| matlab.mixin.SetGetExactNames