Main Content

サブクラス コンストラクターの設計

スーパークラス コンストラクターの明示的な呼び出し

サブクラス コンストラクターから各スーパークラス コンストラクターを明示的に呼び出すと、次のことを実行できます。

  • スーパークラス コンストラクターに引数を渡す

  • 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 のプロパティを初期化しなければなりません。

以下では、クラス ABC の実装で、各クラスでこの関係をどのように設計するかを示しています。

クラス A はプロパティ xy を定義しますが、x にのみ値を割り当てます。

classdef A
   properties
      x
      y
   end
   methods
      function obj = A(x)
         ...
            obj.x = x;
      end
   end
end

クラス B は、クラス A からプロパティ xy を継承します。クラス B のコンストラクターは、クラス A のコンストラクターを呼び出して x を初期化してから、y に値を割り当てます。

classdef B < A
   methods
      function obj = B(x,y)
         ...
         obj@A(x);
         obj.y = y;
      end
   end
end

クラス C は、プロパティ xy に対する値を受け取り、これらの値をクラス B のコンストラクターに渡し、これは次にクラス A のコンストラクターを呼び出します。

classdef C < B
   methods
      function obj = C(x,y)
         ...
         obj@B(x,y);
      end
   end
end

関連するトピック