サブクラス コンストラクターの設計
スーパークラス コンストラクターの明示的な呼び出し
サブクラス コンストラクターから各スーパークラス コンストラクターを明示的に呼び出すと、次のことを実行できます。
スーパークラス コンストラクターに引数を渡す
MATLAB® がスーパークラス コンストラクターを呼び出す順序を制御する
サブクラス コンストラクターからスーパークラス コンストラクターを明示的に呼び出さない場合は、MATLAB によって、これらのコンストラクターが引数なしで暗黙的に呼び出されます。スーパークラス コンストラクターは、暗黙的な呼び出しをサポートするために引数のない構文に対応していなければなりません。また、コンストラクターは、クラス ブロックの上部に表示された順序で左から右の順に呼び出されます。MATLAB がコンストラクターを呼び出す順序を変更する場合や引数を使用してコンストラクターを呼び出す場合は、サブクラス コンストラクターからスーパークラス コンストラクターを明示的に呼び出します。
サブクラス コンストラクターを定義しない場合は、スーパークラスの引数を指定して既定のコンストラクターを呼び出すことができます。詳細については、既定のコンストラクターと継承されたコンストラクターの暗黙的な呼び出しを参照してください。
サブクラスからのスーパークラス コンストラクターの呼び出し
サブクラス コンストラクター内で各スーパークラスのコンストラクターを呼び出すには、次の構文を使用します。
obj@SuperClass1(args,...);
...
obj@SuperclassN(args,...);
ここで、obj はサブクラス コンストラクターの出力、SuperClass... はスーパークラスの名前、args は対応するスーパークラス コンストラクターで必要な引数です。
たとえば、クラスを定義する以下のセグメントは、Assets と呼ばれるクラスのサブクラスである、Stocks と呼ばれるクラスを表します。
classdef Stocks < Assets methods function s = Stocks(asset_args,...) if nargin == 0 % Assign values to asset_args end % Call asset constructor s@Assets(asset_args); ... end end end
サブクラス コンストラクター メソッドの作成については、サブクラス コンストラクター に記載しています。
名前空間に含まれるスーパークラスの参照
スーパークラスが名前空間に含まれる場合は、名前空間名を含めます。たとえば、Assests クラスは finance 名前空間内にあります。
classdef Stocks < finance.Assets methods function s = Stocks(asset_args,...) if nargin == 0 ... end % Call asset constructor s@finance.Assets(asset_args); ... end end end
複数のスーパークラスを使用したオブジェクトの初期化
複数のスーパークラスからクラスを派生するには、各スーパークラスのコンストラクターを呼び出して、サブクラスのオブジェクトを初期化します。
classdef Stocks < finance.Assets & Taxable methods function s = Stocks(asset_args,tax_args,...) if nargin == 0 ... end % Call asset and member class constructors s@finance.Assets(asset_args) s@Taxable(tax_args) ... end end end
サブクラス コンストラクターの実装
クラス コンストラクターでゼロ引数の構文が必ずサポートされるようにするには、スーパークラス コンストラクターを呼び出す前に入力引数変数に既定値を代入します。スーパークラス コンストラクターのサブクラス呼び出しには条件を付けられません。条件付きコード ブロックの外にスーパークラス コンストラクターへの呼び出しを配置します。
次の例では、Stocks クラス コンストラクターは if ステートメントで引数なしのケースをサポートしますが、スーパークラス コンストラクターを if コード ブロック外で呼び出します。
classdef Stocks < finance.Assets properties NumShares Symbol end methods function s = Stocks(description,numshares,symbol) if nargin == 0 description = ''; numshares = 0; symbol = ''; end s@finance.Assets(description); s.NumShares = numshares; s.Symbol = symbol; end end end
コンストラクターから直接のスーパークラスのみを呼び出す
サブクラス コンストラクターから、直接のスーパークラス コンストラクターのみを呼び出します。たとえば、クラス B がクラス A から派生し、クラス C はクラス B から派生するとします。クラス C のコンストラクターは、プロパティを初期化するためにクラス A のコンストラクターを呼び出すことはできません。クラス B がクラス A のプロパティを初期化しなければなりません。
以下では、クラス A、B、C の実装で、各クラスでこの関係をどのように設計するかを示しています。
クラス A はプロパティ x と y を定義しますが、x にのみ値を割り当てます。
classdef A properties x y end methods function obj = A(x) ... obj.x = x; end end end
クラス B は、クラス A からプロパティ x と y を継承します。クラス B のコンストラクターは、クラス A のコンストラクターを呼び出して x を初期化してから、y に値を割り当てます。
classdef B < A methods function obj = B(x,y) ... obj@A(x); obj.y = y; end end end
クラス C は、プロパティ x と y に対する値を受け取り、これらの値をクラス B のコンストラクターに渡し、これは次にクラス A のコンストラクターを呼び出します。
classdef C < B methods function obj = C(x,y) ... obj@B(x,y); end end end