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

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

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

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

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

  • 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 класс:

Код класса 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

Похожие темы