Неоднородная иерархия классов позволяет вам создать массивы, содержащие объекты различных классов, которые связаны хотя наследование. Можно задать методы класса, которые работают с этими разнородными массивами в целом.
Дизайн класса на основе разнородных массивов обеспечивает более удобный интерфейс, чем, например, извлекая элементы от массива ячеек и работая с этими элементами индивидуально. Для получения дополнительной информации о дизайне иерархий классов, которые поддерживают разнородные массивы, смотрите Разрабатывающие Неоднородные Иерархии классов.
Все неоднородные иерархии выводят от matlab.mixin.Heterogeneous
.
Этот пример не использует допустимую терминологию или методы для финансовых активов управления. Цель этого примера только, чтобы проиллюстрировать методы для определения неоднородных иерархий классов.
Этот пример реализует систему классов, чтобы представлять финансовые активы, такие как запасы, связи и наличные деньги. Классы, чтобы представлять категории активов имеют определенные общие требования. Каждый экземпляр имеет одно из следующего:
Текстовое описание
Введите (запас, связь или наличные деньги)
Средства определить текущую стоимость актива
Для разнородных массивов этих объектов нужны методы, которые могут работать с целым массивом. Эти операции включают:
Составление таблицы информации обо всех активах содержится в массиве
Построение графика относительного вклада каждого типа актива содержится в массиве
Эти требования включены в класс, который является корнем иерархии. Корневой класс выводит от matlab.mixin.Heterogeneous
. В следующей схеме класс Assets
является корнем иерархии. Stocks
, Bonds
и классы Cash
обеспечивают специализацию, требуемую для каждого типа актива.
Класс Assets
:
Выводит непосредственно от matlab.mixin.Heterogeneous
Корень неоднородной иерархии
Абстрактно
Класс разнородных массивов, состоявших из любой смеси Stock
, Bond
и объектов Cash
Класс Assets
задает два свойства:
Описание
Общее описание отдельного актива, ограниченного быть класса char
.
Ввод
Тип актива задал как абстрактное свойство, которое реализует каждый подкласс.
Класс Assets
задает эти методы:
круг
Изолированный метод, который создает круговую диаграмму, показывающую относительное соединение типов актива.
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
— Тикер, соответствующий этому запасу.
Ввод
реализация класса Stocks
абстрактного свойства задана классом Assets
. Это конкретное свойство должно использовать те же атрибуты в качестве абстрактной версии (то есть, SetAccess private
).
Свойство SharePrice
— Dependent за цену на долю. Метод get.SharePrice
получает текущую цену акции из веб-сервисов, когда это свойство запрошено.
Класс Запасов задает эти методы:
Stocks
— Конструктор присваивает значения свойств и поддерживает конструктора по умолчанию, названного без входных параметров.
getCurrentValue
— Этот метод является реализацией класса Stocks
абстрактного метода, заданного классом Assets
. Это возвращает текущее значение этого актива.
получение. 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
— Годовая процентная ставка связи.
Ввод
реализация класса Bonds
абстрактного свойства задана классом Assets
. Это конкретное свойство должно использовать те же атрибуты в качестве абстрактной версии (то есть, SetAccess private
).
Свойство CurrentYield
— Dependent для текущей доходности, свойство get.CurrentYield
добирается, метод получает значение из веб-сервисов.
Класс Bonds
задает эти методы:
Bonds
— Конструктор присваивает значения свойств и поддерживает конструктора по умолчанию, названного без входных параметров.
getCurrentVlaue
— Этот метод является реализацией класса Bonds
абстрактного метода, заданного классом Assets
. Это возвращает текущее значение этого актива.
получение. 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 = 0 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; b.Type = AssetTypes.Bonds; 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
— Сумма наличными сохранена в этом активе.
Ввод
реализация класса Cash
абстрактного свойства задана классом Assets
. Это конкретное свойство должно использовать те же атрибуты в качестве абстрактной версии (то есть, SetAccess private
).
Класс Cash
задает эти методы:
Cash
— Конструктор присваивает значения свойств и поддерживает конструктора по умолчанию, названного без входных параметров.
getCurrentValue
— Этот метод является реализацией класса Cash
абстрактного метода, заданного классом Assets
. Это возвращает текущее значение этого актива.
сохранение
Этот метод добавляет заданную сумму наличными к существующей сумме и возвращает новый объект 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
задает эти методы, чтобы работать с разнородными массивами объектов актива:
круг
Создает круговую диаграмму, показывающую соединение типов актива в массиве.
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
Эти операторы создают разнородный массив путем конкатенации 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' Stocks 1232.5 '3 Month T' Bonds 807.69 'Bank Account' Cash 500 'Gold' Cash 500