
- •Часть 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 Редактор р.К. Мангутова
InPutNames % cell array of strings (массив ячеек строк) – имена
% входных портов.
OutPutName % a string (строка) - имя выходного порта.
end
properties (Dependent = true) % Зависимое свойство,
% поскольку его значение определяется входами.
OutPutRate % Скорость выходных данных.
end
methods
function obj = OMuxCard(inptnames, inptrates,... outpname) % Конструктор OMuxCard-
% объектов; inptnames – имена входов, inptrates –
% скорости входных портов, outpname – имя выхода.
obj = obj@int32(inptrates); % initial the int32 class
% portion (инициализация части класса int32).
obj.InPutNames = inptnames;
obj.OutPutName = outpname;
end
function x = get.OutPutRate(obj) % get-метод
% свойства OutPutRate.
x = sum(obj); % calculate the value of the property (расчет
% величины свойства) - скорость выходного порта; так
% как sum – метод класса int32, x окажется сумой только
% int32-частей OMuxCard-объекта obj, т.е. данных для
% inptrates.
end
end
end
Using the Class with Methods of int32 (Использование класса с int32-методами)
Конструктор класса OMuxCard принимает три аргумента:
-
inptnames – массив ячеек имен входных портов;
-
inptrates – вектор скоростей входных портов;
-
outpname – имя выходного порта.
Пример:
>> omx = OMuxCard({'inp1','inp2','inp3',...
'inp4'},[3 12 12 48],'outp')
% Реакция на этот оператор (без ограничителя «;») касается
% только int32-части OMuxCard-объекта omx, так как данный
% оператор принадлежит классу int32:
ans =
3 12 12 48
Вы можете трактовать OMuxCard-объект как производную инстанцию суперкласса int32, т.е. int32-объект. Поэтому следующее выражение обеспечивает доступ к int32-данным OMuxCard-объекта omx для определения имен входных портов, имеющих скорость 12:
>> omx.InPutNames(find(omx==12)) % Обращение к свойству
% InPutNames (Имена входов) объекта omx класса
% OMuxCard; операция find – метод класса int32, поэтому
% поиск (find) ведется по int32-части (массив inptrates
% скоростей) OMuxCard-объекта omx: скорость 12 соответствует
% индексам 2 и 3 массива inptrates - по этим индексам
% обращение omx.InPutNames дает ответ:
ans =
'inp2' 'inp3'
Индексирование OMuxCard-объекта как общая встроенная MATLAB-операция дает доступ к вектору скоростей:
>> omx(1:2) % Обращение к первым двум элементам вектора
% данных; так как индексирование – общий (встроенный)
% метод, анализироваться будет только int32-часть объекта
% omx, т.е. массив входных скоростей. Ответ:
ans =
3 12
Get-метод свойства OupPutRate класса OMuxCard (см. выше classdef- определение) позволяет использовать встроенную функцию sum (только для int32-части данных – массива скоростей) для расчета скорости выходного порта:
>> omx.OutPutRate % Обращение к свойству OutPutRate
% объекта omx класса OMuxCard автоматически ведет к
% вызову get-метода этого класса. Ответ:
ans =
75
Abstract Classes and Interfaces (Абстрактные классы и интерфейсы)
В этом разделе: |
Abstract Classes (Абстрактные классы); |
В этом разделе (продолжение): |
Interfaces and Abstract Classes (Интерфейсы и абстрактные классы);
Example — Interface for Classes Implementing Graphs (Пример – интерфейс для классов исполнения графиков). |
Abstract Classes (Абстрактные классы)
Абстрактный класс трактуется как базисный (т.е. суперкласс) для группы связанных подклассов. Он формирует абстракции, общие для всех подклассов, путем спецификации своих свойств и методов, которые все подклассы должны выполнять. Однако абстрактный класс не может сам иметь инстанции. Только подклассы могут порождать инстанции. Эти подклассы иногда называются конкретными классами.
Абстрактные классы полезны для описания функциональности, общей для группы классов, но предполагающей особое исполнение в каждом из них. Такой подход часто называют интерфейсным.
Defining Abstract Classes (Определение абстрактных классов)
Определяйте абстрактный класс установкой атрибута Abstract одного или более методов в true. Вы не должны использовать конструкцию function...end для определения абстрактного метода - используйте только methods-сигнатуру (предписание) метода.
Например, ниже абстрактный класс group определяет два метода, которые принимают два входных аргумента и возвращают результат операции, вызванной каждым из этих методов:
classdef group
% Both methods must be implemented so that the operations are
% commutative (Оба метода должны быть исполнены,
% поэтому операции коммутативны):
methods (Abstract)
rsult = add(numeric,polynom)
rsult = times(numeric,polynom)
end
end
Подклассы должны исполнять методы с теми же именами (здесь add и times). Абстрактный класс обычно детализирует ожидаемое исполнение посредством комментария и аргументов.
Abstract Properties (Абстрактные свойства)
Для свойств, имеющих атрибут Abstract, установленный в true:
-
Конкретный подкласс должен переопределить абстрактные свойства без установленного в true атрибута Abstract и должен использовать те же величины для атрибутов SetAccess и GetAccess, что и базовый класс;
-
Абстрактные свойства не могут определять методы доступа set или get (см. Controlling Property Access - Контроль допуска к свойствам) и не могут специфицировать начальные величины. Подкласс должен определить свойства и затем может создать их set- или get-методы допуска и специфицировать начальные величины.
Abstract Methods (Абстрактные методы)
Для методов, имеющих атрибут Abstract, установленный в true:
-
Абстрактные методы не должны иметь исполнения в абстрактном классе. Метод имеет обычную строку обращения к функции (без ключевых слов function и end), которое может включать списки входных и выходных аргументов;
-
Подклассам не требуется поддержка того же самого числа входных и выходных аргументов и тех же самых имен аргументов. Однако подклассы обычно используют ту же самую сигнатуру, когда исполняют свою версию метода.