Реализация Устанавливала/Получала Интерфейс для Свойств

Стандартный набор / Получает Интерфейс

Некоторые объекты 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

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

Класс, выведенный из matlab.mixin.SetGet

Этот демонстрационный класс задает установить/получить интерфейс и иллюстрирует поведение унаследованных методов:

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 свойство.

Примечание

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

Смотрите также

| | |

Похожие темы