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