クラス定義での関数のオーバーロード
関数をオーバーロードする理由
クラスは、同じ名前をもつメソッドを実装することで、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
MyData
の bar
メソッドには MATLAB の関数 bar
と同じ名前が付けられています。しかし、MyData
の bar
メソッドでは入力として 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 つのメソッドを定義できません。さらに、クラスはメソッドと同じ名前でローカル関数を定義できません。
静的メソッドの名前は、そのクラスの接頭辞なしで考えられます。したがって、そのクラスの接頭辞なしの静的メソッドの名前は、他のメソッドの名前と同じにすることはできません。