メソッドの構文
このトピックでは、methods...end
ブロックを使用して MATLAB® でクラス メソッドを定義する方法を説明します。また、メソッドの引数の検証についても紹介します。このトピックでは、"通常のメソッド" とも呼ばれる非静的な具象メソッドに着目します。他のタイプのメソッドについては、以下を参照してください。
メソッド定義ブロック
キーワード methods
と end
は、同じ属性設定をもつ、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}
mustBeNumeric
やmustBeScalarOrEmpty
などの検証関数のコンマ区切りリスト。検証関数の一覧は、引数の検証関数を参照してください。
— 既定値は、指定されたサイズ、型、および検証ルールに準拠しなければなりません。defaultValue
入力引数の検証構文の要素の詳細な説明は、arguments
を参照してください。
入力引数の検証は、パブリック アクセスを使用するメソッドで役立ちます。メソッドの呼び出し元から許可される引数値の型を制限すると、メソッドの本体が実行される前にエラーを防ぐことができます。たとえば、Rectangle
クラスは座標面の四角形を表し、その位置 (X
と Y
) およびその幅と高さを指定するプロパティをもちます。
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
メソッドは、ユーザー入力 x
と y
をそれぞれ Width
と Height
に追加することで、四角形の高さと幅を増やします。メソッドの目的は 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
を参照してください。
出力引数の検証では、クラスの作成者は、メソッドが返す出力の型を記録できるのに加え、出力型が変更され得る将来のコード変更に対してフェールセーフを実現できます。たとえば、Rectangle
の enlarge
メソッドは、オブジェクト メソッドが Rectangle
のスカラー インスタンスを返しているかを確認するために、出力引数の検証を使用します。
arguments (Output) R (1,1) Rectangle end
たとえば、enlarge
が、オブジェクトそのものではなく Rectangle
の次元のみ返すように後で修正された場合、出力の検証は、この潜在的な誤りを見つけるのに役立ちます。
メソッドの検証に関する特別な考慮事項
クラス メソッドの引数の検証は、関数に対する検証と同様に機能しますが、引数の検証にはメソッドに固有の側面もあります。
classdef
ファイルに、別々のファイルで定義されたメソッドのメソッド プロトタイプが含まれる場合、それらのメソッドに対してユーザーが定義したいarguments
ブロックは、その個別のファイル内で定義しなければなりません。別のファイルでメソッドを定義する方法の詳細については、別ファイルのメソッドを参照してください。サブクラス メソッドは、引数の検証を継承しません。スーパークラス メソッドをオーバーライドするサブクラス メソッドで引数の検証を維持するには、サブクラス メソッドのスーパークラス メソッドから引数の検証を繰り返します。
抽象メソッドは
arguments
ブロックを定義できないため、引数の検証をサポートしません。詳細については、抽象クラスとクラス メンバーを参照してください。ハンドル クラスのデストラクター メソッドは、引数の検証を使用できません。ハンドル クラスでは、ハンドル オブジェクトが到達できなくなる場合や、それが
delete
の呼び出しで明示的に削除されている場合、delete
という名前のデストラクター メソッドが MATLAB によって呼び出されます。デストラクターには厳密に 1 つの入力が必要で、出力および引数の検証は含めることができません。MATLAB は他の方法で定義されているメソッドを通常のメソッドとして処理し、それをデストラクターとしては使用しません。詳細については、ハンドル クラスのデストラクターを参照してください。