Main Content

このページの内容は最新ではありません。最新版の英語を参照するには、ここをクリックします。

異種混合配列のクラス階層

異種混合配列に基づくインターフェイス

異種混合クラス階層を使用すると、継承によって関連する異なるクラスのオブジェクトを含んだ配列を作成できます。これらの異種混合配列全体に対して操作を行うクラス メソッドを定義できます。

異種混合配列に基づくクラスの設計は、たとえば、要素を cell 配列から抽出して個別の要素に対して操作を行うよりも便利なインターフェイスを提供します。異種混合配列をサポートするクラス階層の設計の詳細については、異種混合クラス階層の設計を参照してください。

すべての異種混合階層は matlab.mixin.Heterogeneous から派生します。

異種混合階層の定義

メモ

この例では、金融資産の管理に使用できる用語や手法は使用しません。この例の目的は、異種混合クラス階層を定義する手法を説明することのみです。

この例では、株式、債券、現金などの金融資産を表すクラスのシステムを実装します。資産のカテゴリを表すクラスには、特定の共通要件があります。各インスタンスは次のいずれかをもっています。

  • テキストによる説明

  • 種類 (株式、債券または現金)

  • 資産の現在値を判別する手段

これらのオブジェクトの異種混合配列は、配列全体に対して操作を実行できるメソッドを必要とします。こうした操作には、次が含まれます。

  • 配列に含まれるすべての資産についての情報の表を作成

  • 配列に含まれる資産の種類ごとの相対的な寄与をグラフ化

これらの要件は、階層のルートであるクラスに反映されます。ルート クラスは matlab.mixin.Heterogeneous から派生しています。次の図では、Assets クラスが階層のルートです。StocksBonds および Cash の各クラスは資産の種類ごとに必要な特殊化を提供します。

Diagram of financial asset class hierarchy

Assets クラス

Assets クラスは、以下のようになります。

  • matlab.mixin.Heterogeneous から直接派生する

  • 異種混合階層のルートである

  • 抽象型である

  • StockBond および Cash の各オブジェクトの任意の組み合わせで構成される異種混合配列のクラスである

プロパティ

Assets クラスは、2 つのプロパティを定義します。

  • Description — クラス char に制約される個々の資産の一般的な説明。

  • Type — 各サブクラスが実装する抽象プロパティとして定義される資産の種類。

メソッド

Assets クラスは以下のメソッドを定義します。

  • pie — 資産の種類の相対的な構成を示す円グラフを作成するシールされたメソッド。

  • makeReport — 資産をリストするレポートを作成するシールされたメソッド。

  • getCurrentValue — 資産の現在値を返すために各具象サブクラスが実装しなければならない抽象メソッド。

  • getDefaultScalarElement — 既定のオブジェクトを指定するために Assets クラスでオーバーライドされる matlab.mixin.Heterogeneous クラスのメソッド。Assets クラスは抽象型のため、既定のオブジェクトとして使用できません。詳細については、既定のオブジェクトを参照してください。

異種混合階層のメソッド

Assets クラスで定義されるメソッドは次のいずれかです。

  • サブクラスがオーバーライドしない具象メソッド (完全に実装)

  • サブクラスが実装する抽象メソッド (シグネチャのみ)

異種混合階層のスーパークラスで定義される具象メソッドは Sealed 属性を指定しなければなりません。これらのメソッドをシールすると、サブクラスがスーパークラスによって実装されたメソッドをオーバーライドすることを回避できます。異種混合配列でメソッドを呼び出すと、MATLAB® は配列のクラス (この例では Assets) で定義されたメソッドを呼び出します。

pie メソッドと makeReport メソッドは、StockBond および Cash の各オブジェクトで構成される異種混合配列に対して操作を行うシールされたメソッドの例です。

異種混合階層のスーパークラスによって定義された抽象メソッドは、Abstract 属性を指定しなければなりません。抽象メソッドをスーパークラスで定義することにより、具象サブクラスが確実にそのメソッド名に対する実装をもつようになります。これらのメソッドを要素単位で使用して、各オブジェクトが自身のメソッドを呼び出すようにします。

getCurrentValue メソッドは、各資産の現在値を取得するために各サブクラスによって実装されている抽象メソッドの例です。

それぞれの種類のサブクラス オブジェクトは、異なる方法でその現在値を計算します。別のサブクラスを階層に追加して別のカテゴリの資産を追加する場合、このクラスは固有のバージョンの getCurrentValue メソッドを実装しなければなりません。すべてのサブクラスが getCurrentValue メソッドを実装するため、pie メソッドと makeReport メソッドは新たに追加されたサブクラスを操作します。

メソッド属性 Sealed および Abstract の詳細については、メソッドの属性を参照してください。

Assets クラスのコード

階層の 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 のコードのリストについては、Assets 配列での操作を参照してください。

Stocks クラス

Stocks クラスは金融資産の特定の種類を表します。これは Assets クラスによって定義された抽象メンバーを実装する具象クラスであり、この種類の資産特有のクラスのプロパティとメソッドを定義します。

プロパティ

Stocks クラスは以下のプロパティを定義します。

  • NumShares — この資産で所有されている株式数。

  • Symbol — この株式に対応する株式銘柄コード。

  • TypeAssets クラスによって定義された抽象プロパティの Stocks クラスの実装。この具象プロパティは抽象バージョンと同じ属性を使用しなければなりません (つまり SetAccess private)。

  • SharePrice — 1 株あたりの株価に対する依存プロパティ。get.SharePrice メソッドは、このプロパティがクエリされると Web サービスから現在の株価を取得します。

メソッド

Stocks クラスは以下のメソッドを定義します。

  • Stocks — コンストラクターはプロパティ値を代入し、入力引数なしで呼び出される既定のコンストラクターをサポートします。

  • getCurrentValue — このメソッドは、Assets クラスによって定義された抽象メソッドの Stocks クラスの実装です。この資産の現在値を返します。

  • get.SharePrice — 依存プロパティ SharePrice に対するプロパティの get メソッドは、この株式の現在の株価を返します。MATLAB から Web サービスにアクセスする方法の詳細については、関数 webread を参照してください。

Stocks クラスのコード

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 クラス

Bonds クラスは金融資産の特定の種類を表します。これは Assets クラスによって定義された抽象メンバーを実装する具象クラスであり、この種類の資産特有のクラスのプロパティとメソッドを定義します。

プロパティ

Bonds クラスは以下のプロパティを定義します。

  • FaceValue — 債券の額面価格。

  • Yield — 債券の年利。

  • TypeAssets クラスによって定義された抽象プロパティの Bonds クラスの実装。この具象プロパティは抽象バージョンと同じ属性を使用しなければなりません (つまり SetAccess private)。

  • CurrentYield — 現行利回りに対する依存プロパティ。get.CurrentYield プロパティの get メソッドは Web サービスから値を取得します。

メソッド

Bonds クラスは以下のメソッドを定義します。

  • Bonds — コンストラクターはプロパティ値を代入し、入力引数なしで呼び出される既定のコンストラクターをサポートします。

  • getCurrentVlaue — このメソッドは、Assets クラスによって定義された抽象メソッドの Bonds クラスの実装です。この資産の現在値を返します。

  • get.CurrentYield — 依存プロパティ CurrentYield に対するプロパティの get メソッドは、この債券の現行利回りを返します。MATLAB から Web サービスにアクセスする方法の詳細については、関数 webread を参照してください。

Bonds クラスのコード

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 クラス

Cash クラスは金融資産の特定の種類を表します。これは Assets クラスによって定義された抽象メンバーを実装する具象クラスであり、この種類の資産特有のクラスのプロパティとメソッドを定義します。

プロパティ

Cash クラスは以下のプロパティを定義します。

  • Amount — この資産で保持されている現金額。

  • TypeAssets クラスによって定義された抽象プロパティの Cash クラスの実装。この具象プロパティは抽象バージョンと同じ属性を使用しなければなりません (つまり SetAccess private)。

メソッド

Cash クラスは以下のメソッドを定義します。

  • Cash — コンストラクターはプロパティ値を代入し、入力引数なしで呼び出される既定のコンストラクターをサポートします。

  • getCurrentValue — このメソッドは、Assets クラスによって定義された抽象メソッドの Cash クラスの実装です。この資産の現在値を返します。

  • save — このメソッドは指定された現金額を既存の金額に追加し、現在の金額をもつ新しい Cash オブジェクトを返します。

  • spend — このメソッドは指定された金額を現在の金額から差し引き、現在の金額をもつ新しい Cash オブジェクトを返します。

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 はこのクラスのオブジェクトを作成します。

  • インデックス番号にギャップのあるインデックス付き代入を使用した配列の作成。

  • MATLAB が配列要素のクラスを見つけられない場合の、MAT ファイルからの異種混合配列の読み込み。

この図は DefaultAsset クラスの追加を示しています。

Financial assets class hierarchy with DefaultAsset class added

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 配列での操作

Assets クラスは、Asset オブジェクトの異種混合配列に対する操作を行うために、以下のメソッドを定義します。

  • 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 メソッドを呼び出して、円グラフのデータを取得します。

pie メソッドのコード

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

Assets 配列の作成

以下のステートメントは、StocksBonds および 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

Pie chart showing asset allocation

関連するトピック