ドキュメンテーション

最新のリリースでは、このページがまだ翻訳されていません。 このページの最新版は英語でご覧になれます。

オーバーロードされたグラフィックス関数の優先引数

グラフィックス オブジェクトの優先順位

MATLAB® グラフィックス オブジェクトはユーザー定義オブジェクトと同じ優先順位をもちます。グラフィックス オブジェクト (座標軸ハンドルなど) を最初の引数として受け入れるメソッドを実装する場合、MATLAB グラフィックス クラスを下位クラスとして定義します。

優先される引数

複数のクラスのオブジェクトを含む式を評価する場合、MATLAB は優先される引数を使用して呼び出すメソッドまたは関数を決定します。

MATLAB が関数呼び出しに応答してディスパッチする方法を以下に示します。

  • 引数のクラスに基づいて優先引数を決定する。

  • 優先引数がある場合、上位クラスのメソッドを呼び出す。

  • 引数の優先順位が等しい場合、一番左にある引数を優先引数とする。

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

クラスの優先順位の定義

InferiorClasses クラスの属性を使用して、MATLAB クラスの相対的な優先順位を指定します。以下に基本構文を示します。

classdef (InferiorClasses = {?class1,?class2}) ClassName

TemperatureData クラスの以下の定義は、温度データをグラフ表示するように特化したバージョンの plot を実装します。クラス plot メソッドは、座標軸ハンドルを最初の引数にできるように可変数の入力引数をサポートします。

plot(obj)
plot(ax,obj)

objTemperatureData クラスのインスタンスで、axaxes ハンドルです。

TemperatureData クラスは matlab.graphics.axis.Axes を下位クラスとして指定するため、MATLAB はいずれの場合も plot を呼び出します。

classdef (InferiorClasses = {?matlab.graphics.axis.Axes}) TemperatureData
   properties
      Time
      Temperature
   end
   methods
      function obj = TemperatureData(x,y)
         obj.Time = x;
         obj.Temperature = y;
      end
      function plot(varargin)
         if nargin == 1
            obj = varargin{1};
            plot(obj.Time,obj.Temperature)
         elseif nargin == 2
            ax = varargin{1};
            obj = varargin{2};
            plot(ax,obj.Time,obj.Temperature)
         elseif nargin > 2
            ax = varargin{1};
            obj = varargin{2};
            plot(ax,obj.Time,obj.Temperature,varargin{3:end})
         end
         datetick('x')
         xlabel('Time')
         ylabel('Temperature')
      end
   end
end

以下に示す plot の呼び出しは、組み込み関数 plot でなく TemperatureData plot メソッドにディスパッチします。これは、TemperatureData オブジェクトが axes オブジェクトより上位であるためです。

x = 1:10;
y = rand(1,10)*100;
ax = axes;
td = TemperatureData(x,y);
plot(ax,td)

下位クラス メソッドの呼び出し

あるクラスを使用中のクラスの下位クラスとして宣言し、その両方のクラスがメソッドを同じ名前で定義している場合、MATLAB は引数の順序にかかわらず、使用中のクラス メソッドにディスパッチします。

前の節で説明されている TemperatureData クラスが set を定義するとします。TemperatureData クラスのオブジェクトを axes オブジェクトの UserData プロパティに割り当てようとしたとします。

td = TemperatureData(x,y);
set(gca,'UserData',td)

結果は TemperatureData set メソッドへの呼び出しとなり、MATLAB は組み込み関数の set を呼び出しません。

下位クラスをもつ関数 set の使用をサポートするには、最初の引数がその下位クラスのオブジェクトである場合に組み込み関数の set を呼び出すset メソッドを使用中のクラスに実装します。

function set(varargin)
   if isa(varargin{1},'matlab.graphics.axis.Axes')
      builtin('set',varargin{:})
   else
   ...
end

関連するトピック