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

The Assets класс:
Выводится непосредственно из matlab.mixin.Heterogeneous
Является корнем гетерогенной иерархии
Является абстрактным
Является ли класс разнородных массивов, состоящий из любой смеси Stock, Bond, и Cash объекты
The Assets класс задает два свойства:
Description - общее описание отдельного актива, ограниченного классом; char.
Type - Тип актива, заданный как абстрактное свойство, которое реализует каждый подкласс.
The Assets класс определяет следующие методы:
pie - Запечатанный метод, который создает круговую диаграмму, показывающую относительное сочетание типов активов.
makeReport - Запечатанный метод, который создает отчет с перечислением активов.
getCurrentValue - абстрактный метод, который каждый конкретный подкласс должен реализовать, чтобы вернуть текущее значение актива.
getDefaultScalarElement — matlab.mixin.Heterogeneous метод класса переопределен в Assets класс, чтобы задать объект по умолчанию. The Assets класс абстрактен, поэтому его нельзя использовать в качестве объекта по умолчанию. Для получения дополнительной информации см. раздел Объект по умолчанию.
Методы, заданные Assets Либо классы:
Конкретные методы (полностью реализованные), которые подклассы не переопределяют
Абстрактные методы (только сигнатуры), которые реализуют подклассы
Конкретные методы, заданные суперклассами в гетерогенной иерархии, должны задавать Sealed атрибут. Запечатывание этих методов препятствует переопределению подклассами методов, реализованных суперклассом. При вызове методов в разнородном массиве MATLAB® вызывает методы, заданные классом массива (Assets в этом примере).
The pie и makeReport методы являются примерами герметичных методов, которые работают с разнородными массивами, состоящими из Stock, Bond, и Cash объекты.
Абстрактные методы, заданные суперклассами в гетерогенной иерархии, должны задавать Abstract атрибут. Определение абстрактного метода в суперклассе гарантирует, что конкретные подклассы имеют реализацию для этого точного имени метода. Используйте эти методы поэлементно, так что каждый объект вызывает свой собственный метод.
The getCurrentValue метод является примером абстрактного метода, который реализуется каждым подклассом, чтобы получить текущее значение каждого актива.
Каждый тип объекта подкласса вычисляет свое текущее значение по-разному. Если вы добавляете другую категорию активов путем добавления другого подкласса в иерархию, этот класс должен реализовать свою собственную версию getCurrentValue способ. Потому что все подклассы реализуют getCurrentValue метод, pie и makeReport методы работают с вновь добавленными подклассами.
Для получения дополнительной информации о Sealed и Abstract атрибуты метода, см. «Атрибуты метода».
The 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, см. «Работа с массивом активов».
The Stocks класс представляет определенный тип финансового актива. Это конкретный класс, который реализует абстрактные представители, заданные Assets и определяет свойства и методы классов, характерные для этого типа актива.
The Stocks класс задает следующие свойства:
NumShares - Количество акций, принадлежащих данному активу.
Symbol - Символ тикера, соответствующий этому запасу.
Type — Stocks реализация класса абстрактного свойства, заданная Assets класс. Это конкретное свойство должно использовать те же атрибуты, что и абстрактная версия (то есть SetAccess private).
SharePrice - Зависимое свойство по цене за акцию. The get.SharePrice метод получает текущую цену акций от веб-сервисов при запросе этого свойства.
Класс «Запасы» определяет следующие методы:
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
The Bonds класс представляет определенный тип финансового актива. Это конкретный класс, который реализует абстрактные представители, заданные Assets и определяет свойства и методы классов, характерные для этого типа актива.
The Bonds класс задает следующие свойства:
FaceValue - Номинальное значение облигации.
Yield - годовая процентная ставка по облигации.
Type — Bonds реализация класса абстрактного свойства, заданная Assets класс. Это конкретное свойство должно использовать те же атрибуты, что и абстрактная версия (то есть SetAccess private).
CurrentYield - Зависимое свойство для текущего выражения, The get.CurrentYield Метод получения свойств получает значение от веб-сервисов.
The 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
The Cash класс представляет определенный тип финансового актива. Это конкретный класс, который реализует абстрактные представители, заданные Assets и определяет свойства и методы классов, характерные для этого типа актива.
The Cash класс задает следующие свойства:
Amount - сумма денежных средств, находящихся в данном активе.
Type — Cash реализация класса абстрактного свойства, заданная Assets класс. Это конкретное свойство должно использовать те же атрибуты, что и абстрактная версия (то есть SetAccess private).
The 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
The Assets класс задает эти методы для работы с разнородными массивами объектов основных средств:
pie - создает круговую диаграмму, показывающую сочетание типов активов в массиве.
makeReport - Использует MATLAB table для отображения таблицы информации об основных средствах.
Чтобы работать с разнородным массивом, для класса разнородного массива должен быть задан метод, который должен быть запечатан. В этом случае класс разнородных массивов всегда является Assets класс. MATLAB не использует класс отдельных элементов разнородного массива при отправке в методы.
The 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
The 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