
- •Часть 3
- •Введение
- •Indexing Functions (Индексирующие функции);
- •1 12 3 4 % Данные double-части объекта md.
- •InPutNames % cell array of strings (массив ячеек строк) – имена
- •Interfaces and Abstract Classes (Интерфейсы и абстрактные классы)
- •Interface Properties and Methods (Интерфейс свойств и методов)
- •Interface Guides Class Design (Интерфейс руководит разработкой класса)
- •Implementing the zoom Method (Исполнение метода zoom)
- •Inheritance of Properties (Наследование свойств)
- •Implementing the PostSet Property Event and Listener (Исполнение PostSet-события свойства и слушателя) показывает пример слушателя свойств.
- •Приложение
- •Implementing a Set/Get Interface for Properties (Исполнение set/get-интерфейса для свойств)…....12
- •Indexing Functions (Индексирующие
- •Inheritance of Properties (Наследование событий)…..........................................................................................54
- •Часть3 Редактор р.К. Мангутова
Implementing the PostSet Property Event and Listener (Исполнение PostSet-события свойства и слушателя) показывает пример слушателя свойств.
Access Methods and Subscripted Reference and Assignment (Методы допуска и индексированные ссылки и назначения)
Вы можете использовать индексирование как средство ссылки или назначения величин свойств (например, a = obj.prop(6) или obj.prop(6) = a) без конфликтов с set- и get-методами. В случае индексной ссылки автоматически вызываемый get-метод возвращает всю величину свойства, и MATLAB получает доступ к её индексированной части.
При индексном назначении get-метод привлекается для получения величины свойства, в ней осуществляется индексное назначение и затем новая величина свойства посылается в set-метод.
MATLAB всегда посылает скалярные объекты к set- и get-методам. Когда ссылка или назначение делается для массива объектов, set- и get-методы вызываются циклически.
Performing Additional Steps with Property Access Methods (Выполнение дополнительных шагов с методами допуска к свойствам)
Методы допуска к свойствам полезны в случаях, где вам необходимо сделать дополнительные шаги до назначения или возвращения величины свойства. Например, ниже класс Testpoint использует set-метод свойства для контроля ранга величины, добавочного масштабирования величины, если она находится в заданных пределах, и установки её в NaN в противном случае.
Get-методы свойства применяют масштабирование до возвращения его текущей величины:
classdef Testpoint % Определение value-класса Testpoint.
properties
expectedResult = []; % Пустое свойство «Ожидаемый
% результат».
end
properties(Constant,SetAccess = private,...
GetAccess = private) % Постоянное свойство
% с приватными допусками.
scalingFactor = 0.001; % Коэффициент масштаба.
end
methods
function obj = set.expectedResult(obj,erIn)
% Для свойства expectedResult value-объекта obj
% назначается принятая величина erIn:
if erIn >= 0 && erIn <= 100 % Если erIn находится
% в заданных пределах 0…100, то:
erIn = erIn.*obj.scalingFactor % erIn
% пересчитывается оператором поэлементного
% умножения переданной в функцию
% set.expectedResult величины erIn на
% коэффициент, взятый из свойства
% scalingFactor value-объекта obj.
obj.expectedResult = erIn; % Передача нового
% значения erIn в свойство expectedResult.
else % Если принятая величина erIn не находится в
% заданных пределах, то:
obj.expectedResult = NaN;
end
end
function er = get.expectedResult(obj) % Get-метод
% свойства expectedResult объекта obj.
er = obj.expectedResult/scalingFactor; % er - % пересчитанная величина свойства % expectedResult объекта obj.
end
end
end
Dynamic Properties — Adding Properties to an Instance (Динамические свойства – добавление свойств к инстанции)
В этом разделе: |
What Are Dynamic Properties (Что такое динамические свойства);
Defining Dynamic Properties (Определение динамических свойств).
|
What Are Dynamic Properties (Что такое динамические свойства)
Используйте динамические свойства для связи данных с инстанцией классов без модификации определения класса. Это полезно для добавления временных данных к объекту. Вы можете получить доступ к динамическому свойству по аналогии с обычным свойством класса для установки и запроса его величины. Вы можете также установить атрибуты свойства, добавить set- и get-методы свойств и определить слушателей для реакции на события изменения свойства.
Допустимы определения динамических свойств более чем одной программой, поэтому необходимо учесть возможные конфликты имен.
Defining Dynamic Properties (Определение динамических свойств)
Любой класс, который является подклассом класса dynamicprops (который сам есть подкласс класса handle), может определить динамические свойства с помощью стандартного метода addprop. Синтаксис следующий:
P = addprop(H,'PropertyName')
где
P - массив meta.Dynamicproperty-объектов;
H - handle-массив;
PropertyName - имя динамического свойства, добавляемого к каждому объекту.
Setting Dynamic Property Attributes (Установка атрибутов динамических свойств)
Используйте meta.Dynamicproperty-object, ассоциированный с динамическим свойством, для установки атрибутов свойств. Например:
P.Hidden = true;
Вы можете убрать динамическое свойство посредством исходного meta.Dynamicproperty-объекта. Так, для объекта P имеем:
delete(P);
Атрибуты свойств Constant, Sealed и Abstract и установки их величин не имеют значения для динамических свойств.
Attaching Data to the Object (Добавление данных к объекту)
Предположим, например, что вы используете ранее определенное множество классов (widget-классов или классов управляющих элементов) GUI(Graphical User Interface - Графический пользовательский интерфейс)-элементов управления (например, кнопки, регуляторы, контрольные блоки и т.д.) и хотите сохранить размещение элементов на сетке каждой инстанции widget-классов. Widget-классы могут быть не предназначены для сохранения размещения вашей конкретной схемы, и вы хотите уйти от создания карты или таблицы размещения для сохранения такой информации отдельно.
Пусть класс button является подклассом класса dynamicprops, и вы хотите добавить динамическое свойство для сохранения данных размещения. Есть очень простое средство для этого - создание uicontrol-объекта (кнопки управления):
classdef button < dynamicprops
properties
UiHandle % Свойство для хранения handle-имени
% управляющего объекта.
end
methods
function obj = button(pos) % Конструктор
% класса button.
% Далее следует создание (uicontrol) управляющего
% объекта на позиции pos (величина свойства Position)
% с последующим сохранением handle-имени этого объекта
% в свойстве UiHandle объекта obj.
obj.UiHandle = uicontrol('Position',pos);
end
end
end
Создайте инстанцию класса button, добавьте динамическое свойство и установите его величину:
b1 = button([20 40 80 20]); % button class uses HG-type
% position layout (класс button использует HG-тип
% размещения) – создание объекта класса button.
b1.addprop('myCoord'); % Add a dynamic property (Добавление
% динамического свойства myCoord (Мои координаты)).
b1.myCoord = [2,3]; % Set the property value (Установка
% величины свойства).
Вы можете получить доступ к динамическому свойству, как и к любому другому свойству, но только для инстанции, в которой оно определено:
>> b1.myCoord % Обращение к динамическому свойству. Ответ:
ans =
2 3
Defining Property Access Methods for Dynamic Properties (Определение методов доступа для динамических свойств)
Динамические свойства позволяют добавлять свойства к инстанциям класса без модификации определений класса. Вы можете также задать для них set- или get-методы допуска без создания новых методов класса. Смотрите Property Access Methods (Методы допуска к свойствам) о целях и техниках этих методов. Однако учитывая, что set- и get-методы для динамических свойств не являются методами класса, допуск к динамическим свойствам возможен только посредством их meta.Dynamicproperty-объектов.
Ниже даны шаги по созданию методов допуска к динамическим свойствам:
-
Определите функцию, которая выполняет желаемые операции до установки или вывода величины свойства.
-
Создайте соответствующий динамическому свойству meta.Dynamicproperty-объект.
-
Назначьте свойствам GetMethod или SetMethod этого meta-объекта handle-указатель (метку) к вашей set- или get-функции свойств. Но эта функция - не метод класса, поэтому вы не можете использовать при его определении схему именования, подобную set.PropertyName. Вместо этого используйте любое допустимое имя функции.
Допустим, вы хотите создать set-функцию для динамического свойства myCoord класса button, определенного выше. Эта функция может быть записана следующим образом:
function set_myCoord(obj,val) % Set-функция для
% динамического свойства myCoord.
if ~(length(val) == 2) % require two values (требуются
% две величины)
error('myCoords require two values ')% Вывод
% сообщения: «myCoords требует две величины».
end
obj.myCoord = val; % set property value (установка величины
% свойства).
end
Поскольку button есть handle-класс, set-функция свойства не обязана вернуть объект как выходной аргумент. Вы просто назначаете величину свойству, если она правильная.
Используйте метод findprop класса handle для получения meta.Dynamicproperty-объекта. Например, применительно к свойству myCoord предыдущего динамического объекта b1:
mb1 = b1.findprop('myCoord'); % Создание meta-объекта
% динамического свойства myCoord.
mb1.SetMethod = @set_myCoord; % Назначение handle-функции
% @set_myCoord свойству SetMethod динамического мета-
% объекта mb1.
Set-функция свойства теперь вызывается всякий раз, когда вы устанавливаете это свойство:
b1.myCoord = [1 2 3] % length must be two (длина должна быть
% равна двум), поэтому выдается сообщение:
??? Error using ==> set_myCoord at 3 (Ошибка – см.
set_myCoord в 3 -
myCoords require two values (myCoords требует две величины).
Dynamic Properties and Property Events (Динамические свойства и события свойств)
Динамические свойства поддерживают set- и get-события, поэтому вы можете определить слушателей для этих свойств. Слушатели ограничены тем динамическим свойством, для которого они определены. Это значит, что, если вы удаляете динамическое свойство и затем создаете другое с тем же именем, слушатели не реагируют на события, генерируемые новым свойством.
Наличие слушателя для удаленного динамического свойства не является ошибкой, но callback-функция слушателя никогда не будет исполнена.
Property-Set and Query Events (События установки и запроса свойств) дает полную информацию об определении слушателей событий.