exponenta event banner

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

Интерфейсы на основе гетерогенных массивов

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

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

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

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

  • TypeStocks реализация класса абстрактного свойства, определенного Assets класс. Это конкретное свойство должно использовать те же атрибуты, что и абстрактная версия (то есть SetAccess private).

  • SharePrice - Зависимое имущество по цене за акцию. get.SharePrice метод получает текущую цену акций от веб-служб при запросе этого свойства.

Методы

Класс Stocks определяет следующие методы:

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

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

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

Код метода makeReport

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

Связанные темы