異種混合配列のクラス階層
異種混合配列に基づくインターフェイス
異種混合クラス階層を使用すると、継承によって関連する異なるクラスのオブジェクトを含んだ配列を作成できます。これらの異種混合配列全体に対して操作を行うクラス メソッドを定義できます。
異種混合配列に基づくクラスの設計は、たとえば、要素を 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
— コンストラクターはプロパティ値を代入し、入力引数なしで呼び出される既定のコンストラクターをサポートします。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
— この資産で保持されている現金額。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