Гетерогенная иерархия классов позволяет создавать массивы, содержащие объекты разных классов, которые связаны хотя и наследственны. Можно задать методы класса, которые работают с этими разнородными массивами в целом.
Проект класса, основанный на разнородных массивах, обеспечивает более удобный интерфейс, чем, например, извлечение элементов из массива ячеек и работа с этими элементами индивидуально. Дополнительные сведения о проекте иерархий классов, поддерживающих разнородные массивы, см. в разделе Разработка гетерогенных иерархий классов.
Все гетерогенные иерархии получают из 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