Main Content

メソッドの構文

このトピックでは、methods...end ブロックを使用して MATLAB® でクラス メソッドを定義する方法を説明します。また、メソッドの引数の検証についても紹介します。このトピックでは、"通常のメソッド" とも呼ばれる非静的な具象メソッドに着目します。他のタイプのメソッドについては、以下を参照してください。

メソッド定義ブロック

キーワード methodsend は、同じ属性設定をもつ、1 つ以上のクラス メソッドを定義します。メソッドそのものは、MATLAB Function ブロックを使用して定義されます。通常のメソッドのブロックを定義する構文は以下のとおりです。

methods (attributes)
   function method1(obj,arg1,...)
      ...
   end
   function method2(obj,arg1,...)
      ...
   end
   ...
end

静的メソッドを除き、クラスのオブジェクトを明示的に MATLAB メソッドに渡さなければなりません。

たとえば、次のクラスは 1 つのパブリック プロパティと 2 つのパブリック メソッドを定義します。各メソッドは、オブジェクトそのものとユーザー指定の引数 inputArg との 2 つの入力引数を取ります。メソッドは、クラス プロパティ Property1 の値と入力引数との積と商を計算します。

classdef methodDemo
   properties
      Property1
   end
   methods
      function prod = propMultiply(obj,inputArg)
         prod = obj.Property1*inputArg;
      end
      function quotient = propDivide(obj,inputArg)
         quotient = obj.Property1/inputArg;
      end
   end
end

属性が異なる複数のメソッド ブロックを定義することもできます。この例では、1 つ目のメソッドは保護されたメソッドで、2 つ目のメソッドはプライベート メソッドです。詳細については、メソッドの属性を参照してください。

classdef attributeDemo
   methods (Access = protected)
      function out = method1(obj,inputArg)
         ...
      end
   end
   methods (Access = private)
      function out = method2(obj,inputArg)
          ...
      end
   end
end

メソッドの引数の検証

メソッドの入力引数と出力引数の制限を定義できます。メソッドの引数を検証するには、arguments ブロックを、関数の場合と同じようにメソッドに追加します。詳細については、arguments を参照してください。

入力引数の検証

入力引数の検証では、メソッドの入力引数のサイズ、クラス、およびその他の特性を制限できます。入力引数の検証の構文は以下のとおりです。

arguments
   argName1 (dimensions) class {validators} = defaultValue
   ...
end

  • (dimensions) — 入力サイズ。(1,2) など、2 つ以上の数値のコンマ区切りリストとして指定します。

  • class — クラス。double などのクラス名またはユーザー定義クラスの名前として指定します。

  • {validators} — 中かっこで囲まれた、mustBeNumericmustBeScalarOrEmpty などの検証関数のコンマ区切りリスト。検証関数の一覧は、引数の検証関数を参照してください。

  • defaultValue — 既定値は、指定されたサイズ、型、および検証ルールに準拠しなければなりません。

入力引数の検証構文の要素の詳細な説明は、arguments を参照してください。

入力引数の検証は、パブリック アクセスを使用するメソッドで役立ちます。メソッドの呼び出し元から許可される引数値の型を制限すると、メソッドの本体が実行される前にエラーを防ぐことができます。たとえば、Rectangle クラスは座標面の四角形を表し、その位置 (XY) およびその幅と高さを指定するプロパティをもちます。

classdef Rectangle
    properties
        X (1,1) double {mustBeReal} = 0
        Y (1,1) double {mustBeReal} = 0
        Width (1,1) double {mustBeReal} = 0
        Height (1,1) double {mustBeReal} = 0
    end
    
    methods
        function R = enlarge(R,x,y)
            arguments (Input)
                R (1,1) Rectangle
                x (1,1) {mustBeNonnegative}
                y (1,1) {mustBeNonnegative}
            end
            arguments (Output)
                R (1,1) Rectangle
            end
            R.Width = R.Width + x;
            R.Height = R.Height + y;
        end
    end
end

enlarge メソッドは、ユーザー入力 xy をそれぞれ WidthHeight に追加することで、四角形の高さと幅を増やします。メソッドの目的は 1 つの四角形を拡大することなので、検証では入力引数を、(1,1) のサイズ制限を持つスカラー値と、mustBeNonnegative を使用する非負の数値に制限します。

クラスをインスタンス化し、enlarge に対する入力を 5 および -1 に指定して enlarge を呼び出します。引数の検証では、エラーが返されます。

rect1 = Rectangle;
rect1.enlarge(5,-1))
Error using Rectangle/enlarge
 rect1.enlarge(5,-1)
                 ↑
Invalid argument at position 2. Value must be nonnegative.

ヒント

入力引数ブロックの (Input) 属性はオプションですが、1 つのメソッドで入力引数ブロックと出力引数ブロックの両方を定義する場合、可読性のために推奨されます。MATLAB では、いずれの属性ももたない引数ブロックは入力引数ブロックとして解釈されます。

出力引数の検証

出力引数の検証の構文は入力検証と同じですが、引数ブロックの属性として (Output) を指定しなければなりません。また、既定値は設定できません。

arguments (Output)
   argName1 (dimensions) class {validators}
   ...
end

出力引数の検証構文の詳細な説明は、arguments を参照してください。

出力引数の検証では、クラスの作成者は、メソッドが返す出力の型を記録できるのに加え、出力型が変更され得る将来のコード変更に対してフェールセーフを実現できます。たとえば、Rectangleenlarge メソッドは、オブジェクト メソッドが Rectangle のスカラー インスタンスを返しているかを確認するために、出力引数の検証を使用します。

arguments (Output)
   R (1,1) Rectangle
end

たとえば、enlarge が、オブジェクトそのものではなく Rectangle の次元のみ返すように後で修正された場合、出力の検証は、この潜在的な誤りを見つけるのに役立ちます。

メソッドの検証に関する特別な考慮事項

クラス メソッドの引数の検証は、関数に対する検証と同様に機能しますが、引数の検証にはメソッドに固有の側面もあります。

  • classdef ファイルに、別々のファイルで定義されたメソッドのメソッド プロトタイプが含まれる場合、それらのメソッドに対してユーザーが定義したい arguments ブロックは、その個別のファイル内で定義しなければなりません。別のファイルでメソッドを定義する方法の詳細については、別ファイルのメソッドを参照してください。

  • サブクラス メソッドは、引数の検証を継承しません。スーパークラス メソッドをオーバーライドするサブクラス メソッドで引数の検証を維持するには、サブクラス メソッドのスーパークラス メソッドから引数の検証を繰り返します。

  • 抽象メソッドは arguments ブロックを定義できないため、引数の検証をサポートしません。詳細については、抽象クラスとクラス メンバーを参照してください。

  • ハンドル クラスのデストラクター メソッドは、引数の検証を使用できません。ハンドル クラスでは、ハンドル オブジェクトが到達できなくなる場合や、それが delete の呼び出しで明示的に削除されている場合、delete という名前のデストラクター メソッドが MATLAB によって呼び出されます。デストラクターには厳密に 1 つの入力が必要で、出力および引数の検証は含めることができません。MATLAB は他の方法で定義されているメソッドを通常のメソッドとして処理し、それをデストラクターとしては使用しません。詳細については、ハンドル クラスのデストラクターを参照してください。

参考

関連するトピック