Main Content

このページの翻訳は最新ではありません。ここをクリックして、英語の最新版を参照してください。

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

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

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

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

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

異種混合階層の定義

メモ

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

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

  • テキストによる説明

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

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

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

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

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

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

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という名前のパッケージ内に含まれています。

classdefAssets < matlab.mixin.Heterogeneous% file: +financial/@Assets/Assets.mpropertiesDescriptionchar='Assets'endproperties(Abstract, SetAccess = private) Typeendmethods(Abstract)% Not implemented by Assets classvalue = getCurrentValue(obj)endmethods(Static, Sealed, Access = protected)functiondefaultObject = getDefaultScalarElement defaultObject = financial.DefaultAsset;endendmethods(Sealed)% Implemented in separate files% +financial/@Assets/pie.m% +financial/@Assets/makeReport.mpie(assetArray) makeReport(assetArray)endend

pieおよびmakeReportのコードのリストについては、Assets 配列での操作を参照してください。

股票クラス

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

プロパティ

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

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

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

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

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

メソッド

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

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

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

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

股票クラスのコード

classdef股票< financial.AssetspropertiesNumSharesdouble= 0 Symbolstringendproperties(SetAccess = private) Type ="Stocks"endproperties(Dependent) SharePricedoubleendmethodsfunctionsk = Stocks(description,numshares,symbol)ifnargin == 0 description =''; numshares = 0; symbol ='';endsk.Description = description; sk.NumShares = numshares; sk.Symbol = symbol;endfunctionvalue = getCurrentValue(sk) value = sk.NumShares*sk.SharePrice;endfunctionpps = get.SharePrice(sk)% Implement web access to obtain% Current price per share% Returning dummy valuepps = 1;endendend

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 クラスのコード

classdefBonds < financial.AssetspropertiesFaceValuedouble= 0 Yielddouble= 0endproperties(SetAccess = private) Type ="Bonds"endproperties(Dependent) CurrentYielddoubleendmethodsfunctionb = Bonds(description,facevalue,yield)ifnargin == 0 description =''; facevalue = 0; yield = 0;endb.Description = description; b.FaceValue = facevalue; b.Yield = yield;endfunctionmv = getCurrentValue(b) y = b.Yield; cy = b.CurrentYield;ifcy <= 0 || y <= 0 mv = b.FaceValue;elsemv = b.FaceValue*y/cy;endendfunctionr = get.CurrentYield(b)% Implement web access to obtain% Current yield for this bond% Returning dummy valuer = 0.24;endendend

Cash クラス

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

プロパティ

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

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

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

メソッド

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

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

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

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

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

Cash クラスのコード

classdefCash < financial.AssetspropertiesAmountdouble= 0endproperties(SetAccess = private) Type ="Cash"endmethodsfunctionc = Cash(description,amount)ifnargin == 0 description =''; amount = 0;endc.Description = description; c.Amount = amount;endfunctionvalue = getCurrentValue(c) value = c.Amount;endfunctionc = save(c,amount) newValue = c.Amount + amount; c.Amount = newValue;endfunctionc = spend(c,amount) newValue = c.Amount - amount;ifnewValue < 0 c.Amount = 0; disp('Your balance is $0.00')elsec.Amount = newValue;endendendend

既定のオブジェクト

このクラス階層の設計は、抽象ルート クラス (Assets) を使用します。したがって、Assetsクラスは使用する具象クラスを、getDefaultScalarElementをオーバーライドして既定のオブジェクトとして指定しなければなりません。この場合、以下のオプションがあります。

  • 既定オブジェクトの既存の具象クラスのいずれかを使用する。

  • 階層で具象クラスを定義して既定オブジェクトで使用する。

この実装では、DefaultAssetクラスをAssetsクラスのサブクラスとして階層に追加します。以下の場合、MATLAB はこのクラスのオブジェクトを作成します。

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

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

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

DefaultAsset クラスのコード

classdefDefaultAsset < financial.Assets% file: +financial/@DefaultAsset/DefaultAsset.mproperties(SetAccess = private) Type ="DefaultAsset"endmethodsfunctionobj = DefaultAsset obj.Description ='Place holder';endfunctionvalue = getCurrentValue(~) value = 0;endendend

Assets 配列での操作

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

  • pie——配列の資産の種類の構成を示す円グラフを作成します。

  • makeReport— MATLABtableオブジェクトを使用して資産情報の表を表示します。

異種混合配列に対して操作を行うには、メソッドは異種混合配列のクラスに対して定義され、シールされていなければなりません。この場合、異種混合配列のクラスは常にAssetsクラスです。MATLABは、メソッドにディスパッチするときに異種混合配列の個々の要素のクラスを使用しません。

makeReport メソッドのコード

AssetsクラスのmakeReportメソッドは、配列の各オブジェクトに共通のプロパティとgetCurrentValueメソッドを使用して表を作成します。

functionmakeReport(obj) numMembers = length(obj); descs = cell(1,numMembers); types(numMembers) =""; values(numMembers) = 0;fork = 1:numMembers descs{k} = obj(k).Description; types(k) = obj(k).Type; values(k) = obj(k).getCurrentValue;endt = table; t.Description = descs'; t.Type = types'; t.Value = values'; disp(t)end

Assetsクラスのpieメソッドは、配列のオブジェクトで要素ごとにgetCurrentValueメソッドを呼び出して、円グラフのデータを取得します。

pie メソッドのコード

functionpie(assetArray) stockAmt = 0; bondAmt = 0; cashAmt = 0;fork=1:length(assetArray)ifisa(assetArray(k),'financial.Stocks') stockAmt = stockAmt + assetArray(k).getCurrentValue;elseifisa(assetArray(k),'financial.Bonds') bondAmt = bondAmt + assetArray(k).getCurrentValue;elseifisa(assetArray(k),'financial.Cash') cashAmt = cashAmt + assetArray(k).getCurrentValue;endendk = 1;ifstockAmt ~= 0 label(k) = {'Stocks'}; pieVector(k) = stockAmt; k = k +1;endifbondAmt ~= 0 label(k) = {'Bonds'}; pieVector(k) = bondAmt; k = k +1;endifcashAmt ~= 0 label(k) = {'Cash'}; pieVector(k) = cashAmt;endpie(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

股票クラス:

+financial/@Stocks/Stocks.m

Bondsクラス:

+financial/@Bonds/Bonds.m

Cashクラス:

+financial/@Cash/Cash.m

DefaultAssetクラス:

+financial/@DefaultAsset/DefaultAsset.m

Assets 配列の作成

以下のステートメントは、股票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

関連するトピック