異種混合配列のクラス階層
異種混合配列に基づくインターフェイス
異種混合クラス階層を使用すると、継承によって関連する異なるクラスのオブジェクトを含んだ配列を作成できます。これらの異種混合配列全体に対して操作を行うクラス メソッドを定義できます。
異種混合配列に基づくクラスの設計は、たとえば、要素を cell 配列から抽出して個別の要素に対して操作を行うよりも便利なインターフェイスを提供します。異種混合配列をサポートするクラス階層の設計の詳細については、異種混合クラス階層の設計を参照してください。
すべての異種混合階層は matlab.mixin.Heterogeneous から派生します。
異種混合階層の定義
メモ
この例では、金融資産の管理に使用できる用語や手法は使用しません。この例の目的は、異種混合クラス階層を定義する手法を説明することのみです。
この例では、株式、債券、現金などの金融資産を表すクラスのシステムを実装します。資産のカテゴリを表すクラスには、特定の共通要件があります。各インスタンスは次のいずれかをもっています。
テキストによる説明
種類 (株式、債券または現金)
資産の現在値を判別する手段
これらのオブジェクトの異種混合配列は、配列全体に対して操作を実行できるメソッドを必要とします。こうした操作には、次が含まれます。
配列に含まれるすべての資産についての情報の表を作成
配列に含まれる資産の種類ごとの相対的な寄与をグラフ化
これらの要件は、階層のルートであるクラスに反映されます。ルート クラスは matlab.mixin.Heterogeneous から派生しています。次の図では、Assets クラスが階層のルートです。Stocks、Bonds および Cash の各クラスは資産の種類ごとに必要な特殊化を提供します。

Assets クラス
Assets クラスは、以下のようになります。
matlab.mixin.Heterogeneousから直接派生する異種混合階層のルートである
抽象型である
Stock、BondおよびCashの各オブジェクトの任意の組み合わせで構成される異種混合配列のクラスである
プロパティ
Assets クラスは、2 つのプロパティを定義します。
Description— クラスcharに制約される個々の資産の一般的な説明。Type— 各サブクラスが実装する抽象プロパティとして定義される資産の種類。
メソッド
Assets クラスは以下のメソッドを定義します。
pie— 資産の種類の相対的な構成を示す円グラフを作成するシールされたメソッド。makeReport— 資産をリストするレポートを作成するシールされたメソッド。getCurrentValue— 資産の現在値を返すために各具象サブクラスが実装しなければならない抽象メソッド。getDefaultScalarElement— 既定のオブジェクトを指定するためにAssetsクラスでオーバーライドされるmatlab.mixin.Heterogeneousクラスのメソッド。Assetsクラスは抽象型のため、既定のオブジェクトとして使用できません。詳細については、既定のオブジェクトを参照してください。
異種混合階層のメソッド
Assets クラスで定義されるメソッドは次のいずれかです。
サブクラスがオーバーライドしない具象メソッド (完全に実装)
サブクラスが実装する抽象メソッド (シグネチャのみ)
異種混合階層のスーパークラスで定義される具象メソッドは Sealed 属性を指定しなければなりません。これらのメソッドをシールすると、サブクラスがスーパークラスによって実装されたメソッドをオーバーライドすることを回避できます。異種混合配列でメソッドを呼び出すと、MATLAB® は配列のクラス (この例では Assets) で定義されたメソッドを呼び出します。
pie メソッドと makeReport メソッドは、Stock、Bond および 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— この株式に対応する株式銘柄コード。Type—Assetsクラスによって定義された抽象プロパティの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— 債券の年利。Type—Assetsクラスによって定義された抽象プロパティのBondsクラスの実装。この具象プロパティは抽象バージョンと同じ属性を使用しなければなりません (つまりSetAccess private)。CurrentYield— 現行利回りに対する依存プロパティ。get.CurrentYieldプロパティの get メソッドは Web サービスから値を取得します。
メソッド
Bonds クラスは以下のメソッドを定義します。
Bonds— コンストラクターはプロパティ値を代入し、入力引数なしで呼び出される既定のコンストラクターをサポートします。getCurrentValue— このメソッドは、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— この資産で保持されている現金額。Type—Assetsクラスによって定義された抽象プロパティの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 クラスの追加を示しています。

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— MATLABtableオブジェクトを使用して資産情報の表を表示します。
異種混合配列に対して操作を行うには、メソッドは異種混合配列のクラスに対して定義され、シールされていなければなりません。この場合、異種混合配列のクラスは常に 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 配列の作成
以下のステートメントは、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