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