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

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

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

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

Все неоднородные иерархии выводят от matlab.mixin.Heterogeneous.

Определение неоднородной иерархии

Примечание

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

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

  • Текстовое описание

  • Введите (запас, связь или наличные деньги)

  • Средства определить текущую стоимость актива

Для разнородных массивов этих объектов нужны методы, которые могут работать с целым массивом. Эти операции включают:

  • Составление таблицы информации обо всех активах содержится в массиве

  • Построение графика относительного вклада каждого типа актива содержится в массиве

Эти требования включены в класс, который является корнем иерархии. Корневой класс выводит от matlab.mixin.Heterogeneous. В следующей схеме класс Assets является корнем иерархии. Stocks, Bonds и классы Cash обеспечивают специализацию, требуемую для каждого типа актива.

Класс активов

Класс Assets:

  • Выводит непосредственно от matlab.mixin.Heterogeneous

  • Корень неоднородной иерархии

  • Абстрактно

  • Класс разнородных массивов, состоявших из любой смеси Stock, Bond и объектов Cash

Свойства

Класс Assets задает два свойства:

  • Описание Общее описание отдельного актива, ограниченного быть класса char.

  • Ввод Тип актива задал как абстрактное свойство, которое реализует каждый подкласс.

Методы

Класс Assets задает эти методы:

  • круг Изолированный метод, который создает круговую диаграмму, показывающую относительное соединение типов актива.

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

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

  • Свойство SharePrice — Dependent за цену на долю. Метод get.SharePrice получает текущую цену акции из веб-сервисов, когда это свойство запрошено.

Методы

Класс Запасов задает эти методы:

  • Stocks — Конструктор присваивает значения свойств и поддерживает конструктора по умолчанию, названного без входных параметров.

  • getCurrentValue — Этот метод является реализацией класса Stocks абстрактного метода, заданного классом Assets. Это возвращает текущее значение этого актива.

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

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

  • Свойство CurrentYield — Dependent для текущей доходности, свойство get.CurrentYield добирается, метод получает значение из веб-сервисов.

Методы

Класс Bonds задает эти методы:

  • Bonds — Конструктор присваивает значения свойств и поддерживает конструктора по умолчанию, названного без входных параметров.

  • getCurrentVlaue — Этот метод является реализацией класса Bonds абстрактного метода, заданного классом Assets. Это возвращает текущее значение этого актива.

  • получение. 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 = 0
   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;
         b.Type = AssetTypes.Bonds;
      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 — Сумма наличными сохранена в этом активе.

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

Методы

Класс Cash задает эти методы:

  • Cash — Конструктор присваивает значения свойств и поддерживает конструктора по умолчанию, названного без входных параметров.

  • getCurrentValue — Этот метод является реализацией класса Cash абстрактного метода, заданного классом Assets. Это возвращает текущее значение этого актива.

  • сохранение Этот метод добавляет заданную сумму наличными к существующей сумме и возвращает новый объект 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 задает эти методы, чтобы работать с разнородными массивами объектов актива:

  • круг Создает круговую диаграмму, показывающую соединение типов актива в массиве.

  • 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

Создание массива активов

Эти операторы создают разнородный массив путем конкатенации 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'    Stocks    1232.5
    '3 Month T'             Bonds     807.69
    'Bank Account'          Cash         500
    'Gold'                  Cash         500

Похожие темы

Была ли эта тема полезной?