Main Content

クラス定義での関数のオーバーロード

関数をオーバーロードする理由

クラスは、同じ名前をもつメソッドを実装することで、MATLAB® 関数を再定義できます。オーバーロードは、既存の MATLAB タイプのように動作する特化したタイプを定義する場合に便利です。たとえば、関係演算、プロット関数、その他一般的に使用されている MATLAB 関数を実装してクラスのオブジェクトを処理できます。

これらの動作を制御する特定の関数を実装して、既定の動作を変更することもできます。既定の動作を変更する関数の詳細については、既定の動作を変更するメソッドを参照してください。

オーバーロードされた MATLAB 関数の実装

クラス メソッドは、クラスのインスタンスにのみ作用する MATLAB 関数の実装を提供します。この制限が可能なのは、オブジェクトの属しているクラスを MATLAB が常に特定できるからです。

MATLAB は優先引数を使って、どのバージョンの関数を呼び出すかを決定します。優先引数がオブジェクトである場合、そのオブジェクトのクラスで定義されるメソッドがあれば、MATLAB はそのメソッドを呼び出します。

クラスがグローバル関数と同じ名前のメソッドを定義する場合、この関数のクラスの実装は、オリジナルのグローバル実装を "オーバーロード" するといいます。

MATLAB 関数をオーバーロードするには、次の手順に従います。

  • オーバーロードする関数と同じ名前のメソッドを定義します。

  • メソッドの引数リストがそのクラスのオブジェクトを必ず受け入れるようにします。MATLAB はこれを使用して、どのバージョンを呼び出すかを判断します。

  • メソッド内で必要な手順を実行して、関数を実装します。たとえば、オブジェクトのプロパティにアクセスしてデータを操作します。

通常、関数をオーバーロードするメソッドは MATLAB 関数と類似の結果を生み出します。しかし、どのようにオーバーロードのメソッドを実装するかに関しての要件はありません。オーバーロードするメソッドは、オーバーロードされた関数のシグネチャに一致する必要はありません。

メモ

MATLAB では、名前が同じでシグネチャが異なる複数のメソッドを同じクラスで定義することはサポートされません。

関数 bar のオーバーロード

クラスのオブジェクトを扱うために、よく使用される関数をオーバーロードすると便利です。たとえば、あるクラスでは、頻繁にグラフ化されるデータを保存するプロパティが定義されているとします。MyData クラスは関数 bar をオーバーライドし、グラフにタイトルを追加します。

classdef MyData
   properties
      Data
   end
   methods
      function obj = MyData(d)
         if nargin > 0
            obj.Data = d;
         end
      end
      function bar(obj)
         y = obj.Data;
         bar(y,'EdgeColor','r');
         title('My Data Graph')
      end
   end
end

MyDatabar メソッドには MATLAB の関数 bar と同じ名前が付けられています。しかし、MyDatabar メソッドでは入力として MyData オブジェクトが必要とされます。このメソッドは MyData のオブジェクト用に特化しているため、Data プロパティからデータを抽出して、専用のグラフを作成できます。

bar メソッドを使用するには、オブジェクトを作成します。

y = rand(1,10);
md = MyData(y);

オブジェクトを使用してメソッドを呼び出します。

bar(md)

ドット表記を使用することもできます。

md.bar

MATLAB 演算子の実装

新しい MATLAB データ型を実装するために設計されたクラスは、一般に、加算、減算、等式など、特定の演算子を定義します。

たとえば、標準の MATLAB の加算 (+) は 2 つの多項式を加算できませんが、これは、この演算が単純な加算では定義されないからです。ただし、polynomial クラスは、独自の plus メソッドを定義できます。+ 記号を使用すると、MATLAB 言語は、polynomial オブジェクトの加算を実行するために、このメソッドを呼び出します。

p1 + p2

演算子のオーバーロードの詳細については、演算子のオーバーロードを参照してください。

競合を回避するための命名規則

メソッド、プロパティ、イベントの名前は、クラスのスコープをもちます。したがって、名前の競合を避けるには、以下の規則に従います。

  • 関連していないクラスで使っている名前を再利用できます。

  • メンバーがパブリックのまたは保護されたアクセスをもたない場合、サブクラスの名前を再利用できます。これらの名前は、スーパークラスの定義に影響せずに、まったくく別の、メソッド、プロパティ、イベントを参照します。

  • クラス内では、どの名前も、同じ名前空間に 1 つに限られ存在します。クラスは、同じ名前で 2 つのメソッドを定義できません。さらに、クラスはメソッドと同じ名前でローカル関数を定義できません。

  • 静的メソッドの名前は、そのクラスの接頭辞なしで考えられます。したがって、そのクラスの接頭辞なしの静的メソッドの名前は、他のメソッドの名前と同じにすることはできません。

関連するトピック