メソッドの呼び出し
MATLAB® クラスは、メソッドを呼び出すドット構文と関数構文の両方をサポートします。このトピックでは、両方の構文について、および MATLAB が呼び出すメソッドがどのように決まるかについて説明します。
ドット構文と関数構文
1 つの引数 arg をもつ非静的メソッドを呼び出すには (ここで、obj はメソッドを定義するクラスのオブジェクト)、ドット構文または関数構文を使用します。
obj.methodName(arg) methodName(obj,arg)
たとえば、dataSetSummary は、一連の数値データを、そのデータの平均値、中央値、および範囲と共に保存します。このクラスには 2 つのメソッドがあります。showDataSet はデータ プロパティに保存されている現在のデータを表示し、newDataSet は data の現在の値を置き換え、そのデータの平均値、中央値、および範囲を計算します。
classdef dataSetSummary properties (SetAccess=private) data {mustBeNumeric} dataMean dataMedian dataRange end methods function showDataSet(obj) disp(obj.data) end function obj = newDataSet(obj,inputData) obj.data = inputData; obj.dataMean = mean(inputData); obj.dataMedian = median(inputData); obj.dataRange = range(inputData); end end end
dataSetSummary のインスタンスを作成し、newDataSet を呼び出してデータをオブジェクトに追加します。ドット構文を使用して、newDataSet を呼び出します。dataSetSummary は値クラスであるため、結果を元の変数に再代入して変更を保持します。
a = dataSetSummary; a = a.newDataSet([1 2 3 4])
a =
dataSetSummary with properties:
data: [1 2 3 4]
dataMean: 2.5000
dataMedian: 2.5000
dataRange: 3
showDataSet メソッドを呼び出しますが、この呼び出しでは関数構文を使用します。
showDataSet(a)
1 2 3 4
式を使用してメソッド名を参照する
式をかっこで囲んでクラス メソッドを動的に呼び出すことができます。
obj.(expression)
この式は、メソッドの名前である文字ベクトルまたは文字列として評価されなければなりません。たとえば、以下の 2 つのステートメントはクラス dataSetSummary のオブジェクト a に対して等価です。
a.showDataSet
a.("showDataSet")この手法は、関数構文で使用しても機能しません。
メソッド呼び出しの結果へのインデックス付け
オブジェクト プロパティや構造体フィールド名など、ドット インデックス付けが定義されている値を返すメソッドであれば、どのメソッドの結果にもドット インデックスを使用できます。たとえば、新しいメソッド returnSummary を、struct に保存されたすべてのデータを返す dataSetSummary クラスに追加します。
function outStruct = returnSummary(obj) outStruct = struct("Data",obj.data,... "Mean",obj.dataMean,... "Median",obj.dataMedian,... "Range",obj.dataRange); end
returnSummary を呼び出し、ドット インデックス付けを使用してデータ セットの中央値を返します。
a.returnSummary.Median
ans =
2.5000関数呼び出しの結果へのインデックス付けの詳細については、関数呼び出しの結果へのインデックス付けを参照してください。
呼び出すメソッドの決定
ドット構文を使用してメソッドを呼び出すと、MATLAB は、ドットの左側にあるオブジェクトのクラスで定義されたメソッドを呼び出します。たとえば、classA と classB の両方が plus というメソッドを定義している場合、このコードは常に classA で定義された plus メソッドを呼び出します。
A = classA; B = classB; A.plus(B)
他の引数は考慮されません。他の引数のメソッドは呼び出されず、関数も呼び出されません。
他の構文では、MATLAB は、与えられた状況で、可能な多くのバージョンからどの演算子または関数を呼び出すかを決定する必要があります。既定の動作では、左端の引数に関連付けられたメソッドが呼び出されます。以下のどちらのステートメントでも、classA によって定義されている plus メソッドが呼び出されます。
objA + objB plus(objA,objB)
ただし、この既定の動作は、1 つのオブジェクトが別のオブジェクトより優先される場合に変更できます。
オブジェクトの優先順位
クラスの定義方法に応じて、メソッドのディスパッチに関してそれらのクラスのオブジェクトを他のオブジェクトよりも優先させることができます。
classdef構文で定義されたクラスは、次の MATLAB クラスよりも優先される。double、single、int64、uint64、int32、uint32、int16、uint16、int8、uint8、char、string、logical、cell、struct、およびfunction_handle。classdef構文で定義されたクラスは、InferiorClasses属性を使用して他のクラスに対する相対的な優先順位を指定できます。
クラスによる多項式の表現では、DocPolynom クラスは、DocPolynom オブジェクトの加算を可能にする、plus メソッドを定義します。DocPolynom インスタンスを作成します。
p = DocPolynom([1 0 -2 -5])
p =
x^3 - 2*x - 5
次のステートメントでは、double を DocPolynom インスタンスに追加します。DocPolynom クラスは、double が 1 + p の左端の引数であっても、組み込み double クラスより優先されます。以下のコードは、DocPolynom plus メソッドを呼び出して多項式を追加します。
1 + p
ans =
x^3 - 2*x - 4
クラス属性に下位クラスをリストすることで、classdef 構文によって定義されたクラスの相対的優先順位を指定することもできます。InferiorClasses 属性は、その属性の引数としてリストされているクラスよりも高い優先順位をクラスに割り当てます。次の classdef ステートメントで InferiorClasses 属性を定義します。
classdef (InferiorClasses = {?class1,?class2}) myClass
この属性は、リストされたクラスの順序で定義されている、クラスの相対的な優先順位を決めます。詳細については、クラスの優先順位を参照してください。