Main Content

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

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

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

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

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

  • MATLAB® がスーパークラス コンストラクターを呼び出す順序を制御する

サブクラス コンストラクターからスーパークラス コンストラクターを明示的に呼び出さない場合は、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 のコンストラクターに渡します。クラス B のコンストラクターは、次にクラス A のコンストラクターを呼び出します。

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

関連するトピック