メソッドの呼び出し
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
を、構造体に保存されたすべてのデータを返す 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
この属性は、リストされたクラスの順序で定義されている、クラスの相対的な優先順位を決めます。詳細については、クラスの優先順位を参照してください。