Main Content

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

メソッドの呼び出し

呼び出すメソッドの決定

MATLAB® が、引数リストをもつ通常のメソッドを呼び出すときには、以下の基準を使用して呼び出すメソッドを決めます。

  • 他の引数のクラスより下位であるとの指定がない最左端の引数のクラスが上位クラスとして選択され、そのクラスのメソッドが呼び出されます。

  • このクラスで、呼び出されたメソッドが定義されていない場合、MATLAB パス上のその名前をもつ関数が呼び出されます。

  • そのような関数が存在しない場合、MATLAB は、上位クラスが名前の付いたメソッドを定義しないことを表すエラーを生成します。

優先される引数

MATLAB では、優先される引数のディスパッチングを使用して、どのバージョンのメソッドを呼び出すかが決定されます。MATLAB は、メソッドのディスパッチング中に、呼び出しの引数の中から優位クラスを決定します。一般に、classdef 構文を使用して定義されたすべての MATLAB クラスに、メソッドのディスパッチングの用途で同じ優先順位が与えられます。

classdef 構文を使用して定義されたクラスは、次の MATLAB クラスよりも優先されます。

doublesingleint64uint64int32uint32int16uint16int8uint8charstringlogicalcellstruct、および function_handle

一般に、2 つ以上のオブジェクトが引数リストに含まれている場合は、クラスに定義されているメソッドの最も左にあるオブジェクトが呼び出されます。しかし、ユーザー定義クラスは、特定のクラスの相対的な優先順位を指定できます。詳細については、クラスの優先順位を参照してください。

たとえば、classAclassB を下位クラスとして定義し、両方のクラスが combine と呼ばれるメソッドを定義すると仮定します。

classBclassA のオブジェクトと共に、メソッドを呼び出すと、

combine(B,A)

A が優先される引数であるため、実際は、classAcombine メソッドが呼び出されます。

ドット表記と関数表記

MATLAB クラスは、メソッドを呼び出すために、関数とドット表記の構文をサポートします。たとえば、setColor がオブジェクト X のクラス メソッドである場合、関数表記と共に setColor を呼び出すと次のようになります。

X = setColor(X,'red');

ドット表記を使用する等価なメソッドは、次のようになります。

X = X.setColor('red')

ただし、場合によっては、ドット表記を使用した結果は、MATLAB のディスパッチの処理方法によって異なる場合があります。

  • オーバーロードされた subsref がある場合は、ドット表記を使用するたびにそれが呼び出されます。つまり、このステートメントは、添字付き引数であるかどうかを調べるためにはじめにテストされます。

  • オーバーロードされた subsref が存在しない場合、setColorX のメソッドでなければなりません。通常の関数またはクラス コンストラクターが、この記号を使用して呼び出されることはありません。

  • ドットの左にある引数 X のみがディスパッチングに使用されます。優先順位が上位であっても、他の引数は検討されません。したがって、ドット表記は、X のメソッドのみを呼び出し、他の引数のメソッドが呼び出されることはありません。

結果が異なる例-  これは、ドット記号と関数表記の結果が異なる例です。次のクラスがあるとします。

  • classA は、classB のオブジェクトをその引数の 1 つとして必要とする、methodA と呼ばれるメソッドを定義します。

  • classB は、classAclassB よりも下位クラスとして定義します。

classdef (InferiorClasses = {?classA}) classB
   ...
end

methodA メソッドは 2 つの入力引数と共に定義されます。そのうちの 1 つは classB のオブジェクトです。

classdef classA
methods
   function methodA(obj,obj_classB)
      ...
   end
end

classB は、methodA という名前のメソッドを定義しません。したがって、以下の構文では、2 番目の引数が優位クラスのオブジェクトであるので、MATLAB は methodA という名前で関数のパスを検索します。パス上にその名前の関数がある場合、MATLAB は、classA のメソッドではなくこの関数を呼び出そうとし、ほとんどの場合、構文エラーを返します。

obj = classA(...);
methodA(obj,obj_classB)

ドット表記の動作は、より正確です。たとえば、以下では methodA が呼び出されます。

obj = classA(...);
obj.methodA(obj_classB)

は、obj のクラスの methodA のみを呼び出すことができます。

式を使用して名前を参照する—動的参照

ドット-かっこ構文の式を使用して、オブジェクトのプロパティまたはメソッドを参照できます。

obj.(expression)

この式は、プロパティまたはメソッドの名前である char ベクトルと評価されます。たとえば、次の 2 つのステートメントは等価です。

obj.Property1
obj.('Property1')

この場合、obj は、Property1 と呼ばれるプロパティを定義するクラスのオブジェクトです。したがって、プロパティへの参照に対して、かっこ内の char 変数を渡すことができます。

propName = 'Property1';
obj.(propName)

他の組のかっこを使用してメソッドを呼び出し、入力引数をメソッドに渡すことができます。

obj.(expression)(arg1,arg2,...)

この表記を使用すると、structs のフィールドに対する動的参照の作成と同じ方法で、プロパティとメソッドへの動的参照を作成できます。

たとえば、あるオブジェクトに、各曜日に対応するメソッドがあるとします。これらのメソッドには曜日と同じ名前が付いています (MondayTuesday など)また、メソッドは、char ベクトルの入力引数として現在の月間通算日 (日付) を取ります。ここで、関数を記述し、その中で現在の曜日に対する正しいメソッドを呼び出すものとします。

関数 date および datestr で作成された式を使用します。

obj.(datestr(date,'dddd'))(datestr(date,'dd'))

datestr(date,'dddd') は、現在の曜日を char ベクトルとして返します。次に例を示します。

datestr(date,'dddd')

ans =

Tuesday

datestr(date,'dd') は、現在の日付を char ベクトルとして返します。次に例を示します。

datestr(date,'dd')

ans =

11

したがって、ドット-かっこを使用する式 (Tuesday the 11th に呼び出される) は、次と等価です。

obj.Tuesday('11')

メソッドの呼び出しの結果へのインデックス付け

メソッドの呼び出しの結果にドット インデックスを使用して、値を取得できます。たとえば、次のクラスはプロパティとコンストラクター メソッドを定義します。コンストラクターは、入力引数を使用して式を評価した後でプロパティ値を設定します。

classdef polyEval
    properties
        Result
    end
    methods
        function obj = polyEval(x)
            if nargin
                obj.Result = 2*x.^3 + 7*x.^2 + 2*x + 7;
            end
        end
    end
end

コンストラクター メソッドの呼び出しの結果にインデックスを付け、プロパティ値にアクセスできます。たとえば、次の polyEval() の呼び出しは、プロパティに代入された値を返します。polyEval クラスのインスタンスは一時変数として作成され、ワークスペースには保存されません。

 polyEval(-3.5).Result
ans =

     0

この場合、式 polyEval(-3.5).Result は値 0 を表します (値 -3.5 は多項式の根)。この式の評価結果を変数に代入するか、または他の式で使用できます。

ドット インデックスが定義されているものに結果を返すメソッドであれば、どのメソッドの結果にもドット インデックスを使用できます。たとえば、オブジェクトや構造体にプロパティまたはフィールド名を使用してインデックスを付けられます。引数がない場合でも、すべてのインデックス式にかっこを含めなければなりません。たとえば、入力を指定しない polyEval() コンストラクターの呼び出しの結果にインデックスを付けるには、次の式を使用します。

 polyEval().Result

関数呼び出しの結果へのインデックス付けの詳細については、関数呼び出しの結果へのインデックス付けを参照してください。

メソッドへのアクセスのコントロール

クラス内での内的な計算用にメソッドを作成し、それらのメソッドをクラスのパブリック インターフェイスの一部として公開するのが望ましくないような場合があります。このような場合、Access 属性を使用して、以下のオプションのいずれかのアクセスに設定できます。

  • public — クラスのオブジェクトへのアクセスをもつコードは、このメソッドにアクセスできます (既定)。

  • private — サブクラスは除き、定義しているクラスへのメソッド アクセスを制限します。サブクラスは、プライベート メソッドを継承しません。

  • protected — 定義しているクラスとそのクラスから派生するサブクラスへのメソッド アクセスを制限します。サブクラスは、このメソッドを継承します。

  • アクセス リスト — メソッド アクセスをアクセス リスト内のクラスに制限します。詳細については、クラス メンバーのアクセスを参照してください。

メソッド ファイル内のローカル関数と入れ子関数は、メソッドと同じアクセスをもちます。クラス定義ファイル内のローカル関数には、同じファイルで定義されるクラスへのプライベート アクセスがあります。

サブクラス メソッドでのスーパークラス メソッドの呼び出し

サブクラスは、スーパークラスで定義されるメソッドの実装をオーバーライドできます。サブクラス メソッドで、スーパークラス メソッドを完全に置き換えるのではなく、追加コードを実行する必要がある場合、MATLAB クラスでは、スーパークラス メソッドを同名のメソッドのサブクラスでの実装から呼び出す特殊な構文を使用できます。

サブクラス内でスーパークラス メソッドを呼び出す構文は、@ を使用します。

MethodName@SuperclassName

たとえば、以下の disp メソッドは、Asset クラスから派生する Stock クラスに対して定義されます。このメソッドは、Stock オブジェクトを渡して、最初に Asset クラスの disp メソッドを呼び出し、Stock オブジェクトの Asset コンポーネントを表示します。Asset disp メソッドが返された後、Stock disp メソッドは、2 つの Stock プロパティを表示します。

classdef Stock < Asset
   methods   
      function disp(s)
         disp@Asset(s) % Call base class disp method first
         fprintf(1,'Number of shares: %g\nShare price: %3.2f\n',...
         s.NumShares,s.SharePrice);
      end % disp
   end
end

使用の制限

以下において、スーパークラス メソッドの呼び出しは制限されます。この表記は、以下の場合のみに使用できます。

  • ユーザーが呼び出しているスーパークラス メソッドと同じ名前をもつメソッド

  • ユーザーが呼び出しているメソッドをもつスーパークラスの、サブクラス

組み込み関数の呼び出し

MATLAB の関数 builtin を使用して、メソッドでオーバーロードされた組み込み関数を呼び出すことができます。

関連するトピック