Разнородная иерархия классов позволяет создавать массивы, содержащие объекты различных классов, которые связаны посредством наследования. Можно определить методы классов, которые работают с этими разнородными массивами в целом.
Конструкция класса, основанная на гетерогенных массивах, обеспечивает более удобный интерфейс, чем, например, извлечение элементов из массива ячеек и работа с этими элементами по отдельности. Дополнительные сведения о разработке иерархий классов, поддерживающих гетерогенные массивы, см. в разделе Проектирование иерархий гетерогенных классов.
Все разнородные иерархии получены из matlab.mixin.Heterogeneous.
Примечание
В этом примере не используется допустимая терминология или методы управления финансовыми активами. Целью этого примера является только иллюстрация методов определения разнородных иерархий классов.
В этом примере реализована система классов для представления финансовых активов, таких как акции, облигации и денежные средства. Классы для представления категорий активов имеют определенные общие требования. Каждый экземпляр имеет одно из следующих значений:
Текстовое описание
Вид (акции, облигации или наличные)
Средства для определения текущей стоимости основного средства
Гетерогенные массивы этих объектов нуждаются в методах, которые могут работать со всем массивом. Эти операции включают в себя:
Создание таблицы информации обо всех активах, содержащихся в массиве
Построение графика относительного вклада каждого типа актива, содержащегося в массиве
Эти требования учитываются в классе, который является корнем иерархии. Корневой класс является производным от matlab.mixin.Heterogeneous. На следующей схеме: Assets класс является корнем иерархии. Stocks, Bonds, и Cash классы предоставляют специализацию, необходимую для каждого типа актива.

Assets класс:
Извлекается непосредственно из matlab.mixin.Heterogeneous
Является корнем разнородной иерархии
Абстрактно
Класс гетерогенных массивов, состоящих из любой смеси Stock, Bond, и Cash объекты
Assets класс определяет два свойства:
Description - общее описание отдельного актива, ограниченного классом; char.
Type - тип актива, определяемый как абстрактное свойство, реализуемое каждым подклассом.
Assets класс определяет следующие методы:
pie - запечатанный метод, который создает круговую диаграмму, показывающую относительное сочетание типов активов.
makeReport - запечатанный метод, который создает отчет с перечнем активов.
getCurrentValue - абстрактный метод, который каждый конкретный подкласс должен реализовать для возврата текущей стоимости актива.
getDefaultScalarElement — matlab.mixin.Heterogeneous метод класса переопределен в Assets для указания объекта по умолчанию. Assets является абстрактным, поэтому его нельзя использовать в качестве объекта по умолчанию. Дополнительные сведения см. в разделе Объект по умолчанию.
Методы, определенные Assets классы:
Конкретные методы (полностью реализованные), которые подклассы не переопределяют
Абстрактные методы (только сигнатуры), реализуемые подклассами
Конкретные методы, определенные суперклассами в гетерогенной иерархии, должны указывать Sealed атрибут. Герметизация этих методов предотвращает переопределение подклассами методов, реализуемых суперклассом. При вызове методов в гетерогенном массиве MATLAB ® вызывает методы, определенные классом массива (Assets в этом примере).
pie и makeReport методы являются примерами запечатанных методов, которые работают на гетерогенных массивах, состоящих из Stock, Bond, и Cash объекты.
Абстрактные методы, определенные суперклассами в гетерогенной иерархии, должны указывать Abstract атрибут. Определение абстрактного метода в суперклассе гарантирует, что конкретные подклассы имеют реализацию для этого точного имени метода. Используйте эти методы по элементам, чтобы каждый объект вызывал свой собственный метод.
getCurrentValue метод является примером абстрактного метода, который реализуется каждым подклассом для получения текущей стоимости каждого актива.
Каждый тип объекта подкласса вычисляет свое текущее значение по-разному. Если добавить другую категорию актива путем добавления в иерархию другого подкласса, этот класс должен реализовать собственную версию getCurrentValue способ. Поскольку все подклассы реализуют getCurrentValue способ, pie и makeReport методы работают с вновь добавленными подклассами.
Для получения дополнительной информации о Sealed и Abstract атрибуты метода, см. раздел Атрибуты метода.
Assets класс и другие классы в иерархии содержатся в пакете с именем financial.
classdef Assets < matlab.mixin.Heterogeneous % file: +financial/@Assets/Assets.m properties Description char = 'Assets' end properties (Abstract, SetAccess = private) Type end methods (Abstract) % Not implemented by Assets class value = getCurrentValue(obj) end methods (Static, Sealed, Access = protected) function defaultObject = getDefaultScalarElement defaultObject = financial.DefaultAsset; end end methods (Sealed) % Implemented in separate files % +financial/@Assets/pie.m % +financial/@Assets/makeReport.m pie(assetArray) makeReport(assetArray) end end
Для списков кодов для pie и makeReportсм. раздел Работа с массивом активов.
Stocks класс представляет определенный тип финансового актива. Это конкретный класс, который реализует абстрактные элементы, определенные Assets и определяет свойства класса и методы, специфичные для этого типа актива.
Stocks класс определяет следующие свойства:
NumShares - Количество акций, принадлежащих данному активу.
Symbol - символ бегущей строки, соответствующий данной заготовке.
Type — Stocks реализация класса абстрактного свойства, определенного Assets класс. Это конкретное свойство должно использовать те же атрибуты, что и абстрактная версия (то есть SetAccess private).
SharePrice - Зависимое имущество по цене за акцию. get.SharePrice метод получает текущую цену акций от веб-служб при запросе этого свойства.
Класс Stocks определяет следующие методы:
Stocks - Конструктор назначает значения свойств и поддерживает конструктор по умолчанию, вызываемый без входных аргументов.
getCurrentValue - Этот метод является Stocks классовая реализация абстрактного метода, определенного Assets класс. Он возвращает текущую стоимость этого актива.
get.SharePrice - Свойство получает метод для зависимого SharePrice свойство возвращает текущую цену акции. Для получения информации о доступе к веб-службам из MATLAB см. webread функция.
classdef Stocks < financial.Assets properties NumShares double = 0 Symbol string end properties (SetAccess = private) Type = "Stocks" end properties (Dependent) SharePrice double end methods function sk = Stocks(description,numshares,symbol) if nargin == 0 description = ''; numshares = 0; symbol = ''; end sk.Description = description; sk.NumShares = numshares; sk.Symbol = symbol; end function value = getCurrentValue(sk) value = sk.NumShares*sk.SharePrice; end function pps = get.SharePrice(sk) % Implement web access to obtain % Current price per share % Returning dummy value pps = 1; end end end
Bonds класс представляет определенный тип финансового актива. Это конкретный класс, который реализует абстрактные элементы, определенные Assets и определяет свойства класса и методы, специфичные для этого типа актива.
Bonds класс определяет следующие свойства:
FaceValue - Номинальная стоимость облигации.
Yield - Годовая процентная ставка облигации.
Type — Bonds реализация класса абстрактного свойства, определенного Assets класс. Это конкретное свойство должно использовать те же атрибуты, что и абстрактная версия (то есть SetAccess private).
CurrentYield - Зависимое свойство для текущей доходности, get.CurrentYield метод получения свойства получает значение от веб-служб.
Bonds класс определяет следующие методы:
Bonds - Конструктор назначает значения свойств и поддерживает конструктор по умолчанию, вызываемый без входных аргументов.
getCurrentVlaue - Этот метод является Bonds классовая реализация абстрактного метода, определенного Assets класс. Он возвращает текущую стоимость этого актива.
get.CurrentYield - Свойство получает метод для зависимого CurrentYield возвращает текущую доходность этой облигации. Для получения информации о доступе к веб-сайту, обслуживаемому из MATLAB, см. webread функция.
classdef Bonds < financial.Assets properties FaceValue double = 0 Yield double = 0 end properties (SetAccess = private) Type = "Bonds" end properties (Dependent) CurrentYield double end methods function b = Bonds(description,facevalue,yield) if nargin == 0 description = ''; facevalue = 0; yield = 0; end b.Description = description; b.FaceValue = facevalue; b.Yield = yield; end function mv = getCurrentValue(b) y = b.Yield; cy = b.CurrentYield; if cy <= 0 || y <= 0 mv = b.FaceValue; else mv = b.FaceValue*y/cy; end end function r = get.CurrentYield(b) % Implement web access to obtain % Current yield for this bond % Returning dummy value r = 0.24; end end end
Cash класс представляет определенный тип финансового актива. Это конкретный класс, который реализует абстрактные элементы, определенные Assets и определяет свойства класса и методы, специфичные для этого типа актива.
Cash класс определяет следующие свойства:
Amount - сумма денежных средств, находящихся в этом активе.
Type — Cash реализация класса абстрактного свойства, определенного Assets класс. Это конкретное свойство должно использовать те же атрибуты, что и абстрактная версия (то есть SetAccess private).
Cash класс определяет следующие методы:
Cash - Конструктор назначает значения свойств и поддерживает конструктор по умолчанию, вызываемый без входных аргументов.
getCurrentValue - Этот метод является Cash классовая реализация абстрактного метода, определенного Assets класс. Он возвращает текущую стоимость этого актива.
save - Этот метод добавляет указанную сумму наличных к существующей сумме и возвращает новую Cash объект с текущей суммой.
spend - Этот метод вычитает указанную сумму из текущей суммы и возвращает новую Cash объект с текущей суммой.
classdef Cash < financial.Assets properties Amount double = 0 end properties (SetAccess = private) Type = "Cash" end methods function c = Cash(description,amount) if nargin == 0 description = ''; amount = 0; end c.Description = description; c.Amount = amount; end function value = getCurrentValue(c) value = c.Amount; end function c = save(c,amount) newValue = c.Amount + amount; c.Amount = newValue; end function c = spend(c,amount) newValue = c.Amount - amount; if newValue < 0 c.Amount = 0; disp('Your balance is $0.00') else c.Amount = newValue; end end end end
В структуре этой иерархии классов используется абстрактный корневой класс (Assets). Следовательно, Assets класс должен указывать конкретный класс для использования в качестве объекта по умолчанию путем переопределения getDefaultScalarElement. В этом случае возможны следующие варианты:
Используйте один из существующих конкретных классов для объекта по умолчанию.
Определите конкретный класс в иерархии, который будет использоваться для объекта по умолчанию.
Эта реализация добавляет DefaultAsset класс в иерархию как подкласс Assets класс. MATLAB создает объекты этого класса, когда:
Создание массивов с использованием индексированного назначения с пробелами в индексных номерах
Загрузка гетерогенных массивов из MAT-файлов, когда MATLAB не может найти класс элемента массива.
На этой диаграмме показано добавление DefaultAsset класс:

classdef DefaultAsset < financial.Assets % file: +financial/@DefaultAsset/DefaultAsset.m properties (SetAccess = private) Type = "DefaultAsset" end methods function obj = DefaultAsset obj.Description = 'Place holder'; end function value = getCurrentValue(~) value = 0; end end end
Assets класс определяет следующие методы для работы с разнородными массивами объектов активов:
pie - создает круговую диаграмму, показывающую сочетание типов активов в массиве.
makeReport - использует MATLAB table для отображения таблицы информации об основных средствах.
Для работы с гетерогенным массивом необходимо определить метод для класса гетерогенного массива и запечатать его. В этом случае класс гетерогенных массивов всегда Assets класс. MATLAB не использует класс отдельных элементов гетерогенного массива при отправке в методы.
Assets класс makeReport строит таблицу с использованием общих свойств и getCurrentValue метод для каждого объекта в массиве.
function makeReport(obj) numMembers = length(obj); descs = cell(1,numMembers); types(numMembers) = ""; values(numMembers) = 0; for k = 1:numMembers descs{k} = obj(k).Description; types(k) = obj(k).Type; values(k) = obj(k).getCurrentValue; end t = table; t.Description = descs'; t.Type = types'; t.Value = values'; disp(t) end
Assets класс pie метод вызывает getCurrentValue для получения данных для круговой диаграммы на основе элементов для объектов в массиве.
function pie(assetArray) stockAmt = 0; bondAmt = 0; cashAmt = 0; for k=1:length(assetArray) if isa(assetArray(k),'financial.Stocks') stockAmt = stockAmt + assetArray(k).getCurrentValue; elseif isa(assetArray(k),'financial.Bonds') bondAmt = bondAmt + assetArray(k).getCurrentValue; elseif isa(assetArray(k),'financial.Cash') cashAmt = cashAmt + assetArray(k).getCurrentValue; end end k = 1; if stockAmt ~= 0 label(k) = {'Stocks'}; pieVector(k) = stockAmt; k = k +1; end if bondAmt ~= 0 label(k) = {'Bonds'}; pieVector(k) = bondAmt; k = k +1; end if cashAmt ~= 0 label(k) = {'Cash'}; pieVector(k) = cashAmt; end pie(pieVector,label) tv = stockAmt + bondAmt + cashAmt; stg = {['Total Value of Assets: $',num2str(tv,'%0.2f')]}; title(stg,'FontSize',10) end
Asset класс:
+financial/@Assets/Assets.m +financial/@Assets/makeReport.m +financial/@Assets/pie.m
Stocks класс:
+financial/@Stocks/Stocks.m
Bonds класс:
+financial/@Bonds/Bonds.m
Cash класс:
+financial/@Cash/Cash.m
DefaultAsset класс:
+financial/@DefaultAsset/DefaultAsset.m
Эти инструкции создают гетерогенный массив путем объединения Stocks, Bonds, и Cash объекты. Вызов makeReport и pie создает отображаемые выходные данные.
s = financial.Stocks('Acme Motor Company',100,string('A')); b = financial.Bonds('3 Month T',700,0.3); c(1) = financial.Cash('Bank Account',500); c(2) = financial.Cash('Gold',500); assetArray = [s,b,c]; makeReport(assetArray) pie(assetArray)
Description Type Value
______________________ _______ ______
{'Acme Motor Company'} "Stock" 1232.5
{'3 Month T' } "Bonds" 875
{'Bank Account' } "Cash" 500
{'Gold' } "Cash" 500