Иерархия классов для разнородных массивов

Интерфейсы, основанные на разнородных массивах

Гетерогенная иерархия классов позволяет создавать массивы, содержащие объекты разных классов, которые связаны хотя и наследственны. Можно задать методы класса, которые работают с этими разнородными массивами в целом.

Проект класса, основанный на разнородных массивах, обеспечивает более удобный интерфейс, чем, например, извлечение элементов из массива ячеек и работа с этими элементами индивидуально. Дополнительные сведения о проекте иерархий классов, поддерживающих разнородные массивы, см. в разделе Разработка гетерогенных иерархий классов.

Все гетерогенные иерархии получают из 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 - абстрактный метод, который каждый конкретный подкласс должен реализовать, чтобы вернуть текущее значение актива.

  • getDefaultScalarElementmatlab.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 - Символ тикера, соответствующий этому запасу.

  • TypeStocks реализация класса абстрактного свойства, заданная 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 - годовая процентная ставка по облигации.

  • TypeBonds реализация класса абстрактного свойства, заданная 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 - сумма денежных средств, находящихся в данном активе.

  • TypeCash реализация класса абстрактного свойства, заданная 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 класс:

Код класса актива 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 не использует класс отдельных элементов разнородного массива при отправке в методы.

Код метода makeReport

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

Похожие темы