メインコンテンツ

このページの内容は最新ではありません。最新版の英語を参照するには、ここをクリックします。

クラス定義を含むフォルダー

さまざまなタイプのフォルダーを使用して、MATLAB® でクラスを定義および整理できます。

  • パス フォルダー — このタイプのフォルダーは MATLAB パス上にあり、フォルダー名は + または @ 記号以外の文字で始まります。1 つのフォルダーに複数のクラスと関数を含める場合に、このタイプのフォルダーを使用します。パス フォルダーでは、各クラス定義は 1 つのファイル内になければなりません。

  • クラス フォルダー — フォルダー名は @ 記号で始まり、それにクラス名が続きます。このタイプのフォルダーは MATLAB パス上にありませんが、親フォルダーが MATLAB パス上にあります。1 つのクラス定義で複数のファイルを使用する場合に、このタイプのフォルダーを使用します。

  • 名前空間フォルダー — フォルダー名は + 記号で始まり、それにクラス名が続きます。名前空間は、クラス フォルダー、クラス定義ファイル、関数ファイル、およびその他の名前空間 ("内部名前空間" と呼ばれる) を含めることができる特別なフォルダーです。フォルダー名はクラス名の一部になるため、名前空間により、その中に含まれる項目に対して、より堅牢な名前が作成されます。

このトピックでは、パス フォルダーとクラス フォルダーの使用について説明します。名前空間の詳細については、名前空間の作成を参照してください。

パス フォルダーの使用

パス フォルダーは MATLAB パス上にあるため、パス フォルダーに配置されたクラス定義は、優先順位に関して通常の関数と同様に動作します。MATLAB パス上で最初にある名前のものが、同じ名前の後続のものより優先されます。

各クラス定義ファイルの名前は、classdef キーワードで指定されたクラスの名前に一致していなければなりません。同じパス フォルダー内に複数のクラスを定義できますが、すべてのメソッドを含め、各クラス定義は 1 つのファイル内に含まれていなければなりません。

1 つのフォルダーに 3 つのクラスが定義されているとします。

.../path_folder/MyClass1.m
.../path_folder/MyClass2.m
.../path_folder/MyClass3.m

これらのクラスを使用するには、MATLAB パスに path_folder を追加します。

addpath path_folder

クラス フォルダーの使用

クラス フォルダーの名前は必ず @ 記号で始まり、その後にフォルダーに含まれているクラス名が続きます。クラス フォルダーはパス フォルダーに含まれていなければなりません。クラス定義ファイルはクラス フォルダー内に配置します。このフォルダーには他のメソッド ファイルを含めることもできます。たとえば、MyClass とその 2 つのメソッドは、@MyClass フォルダー内に定義されています。

.../parent_folder/@MyClass/MyClass.m
.../parent_folder/@MyClass/myMethod1.m
.../parent_folder/@MyClass/myMethod2.m

これらのクラスを使用するには、MATLAB パスに parent_folder を追加します。

クラス定義に複数のファイルを使用する場合は、クラス フォルダーを使用します。クラス フォルダーごとにクラスを 1 つだけ定義します。MATLAB はクラス フォルダー内のすべての関数ファイルをクラスのメソッドとして扱います。クラス定義ファイルには、.m または .p 拡張子を付けることができます。関数ファイルは、MATLAB コード (.m)、ライブ コード (.mlx)、MEX 関数 (プラットフォーム依存の拡張子)、および P コード (.p) にすることができます。

クラス フォルダー内の private フォルダー内の関数

private フォルダーには、その private フォルダーのすぐ上のフォルダーで定義されている関数だけからアクセスできる関数が含まれています。クラス フォルダー内の private フォルダーで定義されているすべての関数は、そのクラスのメソッドからのみ呼び出すことができます。この関数は、クラスのプライベートなメンバーにアクセスできますが、それ自体はメソッドではありません。この関数は、入力として渡すオブジェクトを必要とせず、関数表記を使用してのみ呼び出すことができます。クラスの複数のメソッドから呼び出すことができる補助関数を必要とする場合、private フォルダー内の関数を使用します。

クラス フォルダーに private フォルダーが含まれている場合は、private フォルダーで定義されている関数にアクセスできるのは、このクラス フォルダーに定義されているクラスのみです。サブクラスは、スーパークラスのプライベート関数にはアクセスできません。private フォルダーの詳細については、プライベート関数を参照してください。

スーパークラスのプライベート関数にサブクラスからアクセスできるようにするには、その関数をスーパークラスの保護されたメソッドとして定義します。Access 属性を protected に設定してメソッドを指定します。

private フォルダー内のメソッドへのディスパッチング

クラスがクラス フォルダー内に存在する private フォルダー内で関数を定義している場合、MATLAB は以下の優先順位規則に従って、プライベート関数または classdef ファイルのメソッドにディスパッチします。

  • ドット表記 (obj.methodName) を使用すると、classdef ファイル内で定義されているメソッドが private フォルダー内の同名の関数より優先されます。

  • 関数表記 (methodName(obj)) を使用すると、private フォルダー内の関数が classdef ファイル内で定義されている同名のメソッドより優先されます。

メモ

private フォルダー内にクラス定義を配置することはできません。

クラスの優先順位と MATLAB パス

同じ名前をもつ複数のクラス定義がある場合、MATLAB パス上のファイルの場所で優先順位が決まります。MATLAB パス上で最初に出現するフォルダー内のクラス定義は、パス上のそれよりも後のクラスよりも優先されます。

パス フォルダー内のクラスと同じ名前をもつ関数は、その関数がパス上で前の位置にあるフォルダー内に存在する場合、そのクラスよりも優先されます。ただし、クラス フォルダー (@-folder) 内で定義されるクラスは、同じ名前の関数がパス上で前の位置にあるフォルダー内で定義されている場合でも、その関数よりも優先されます。

たとえば、次のパスには同じ名前をもつ関数とクラスがあります。fldr1 にある関数 Foo の方がパス上では前の位置にあっても、fldr2 にあるクラス Foo の方がクラス フォルダーで定義されているため優先されます。

パス内での順序フォルダーとファイルファイル定義

1

fldr1/Foo.m

関数 Foo

2

fldr2/@Foo/Foo.m

クラス Foo

@ フォルダー内のクラスを同じ名前の関数よりも優先させる規則は、将来のリリースで削除予定

クラス フォルダー (@ フォルダー) で定義されているクラスがパス上の位置に関係なく同じ名前の関数よりも優先される規則は、将来のリリースで削除される予定です。R2024a 以降では、MATLAB は次の 3 つの条件に当てはまる場合に警告を発行します。

  • クラス フォルダーで定義されているクラスと同じ名前の関数がパス上に存在している。

  • クラスよりも関数の方がパス上で早い位置にある。

  • 関数とクラスの名前を使用している。

規則の変更後も常にクラスを優先し、警告を回避するには、次のオプションのいずれかを使用します。

  • クラスの方が関数よりもパス上で早い位置になるようにパスの構成を更新する。パスの操作の詳細については、MATLAB 検索パスとはを参照してください。

  • パスから関数を削除する。

  • 関数の名前を変更する。

常に関数を優先し、警告を回避するには、次のオプションのいずれかを使用します。

  • パスからクラスを削除する。

  • クラスの名前を変更する。

パスの変更によるクラス定義の更新

MATLAB が現在の定義として認識できるのは 1 つのクラス定義のみです。MATLAB パスを変更することにより、クラスの定義ファイルを変更できます (path を参照)。MATLAB は、パスの変更後にクラス定義を更新するための次の規則に従います。

  • クラス定義がパスから削除されると、ワークスペースにそのクラスの既存のインスタンスが存在しない限り、MATLAB はクラス定義をクリアします。

  • 新しいクラス定義がパスに追加され、それが同じ名前の古い定義より優先される場合、MATLAB は新しい定義を使用します。MATLAB は、クラスの既存のインスタンスが次回アクセスされたときにそれらのインスタンスを更新します。

  • スクリプトまたは関数の途中でパスを変更し、その変更中にクラスが更新された場合、スクリプトまたは関数の実行が終了するまで、MATLAB はクラス定義を更新もクリアもしません。

メモ

現在のフォルダーの変更はパスの変更でもあり、現在のフォルダー内のクラス定義は常にパス内の定義より優先されます。

R2024b より前: クラス定義が含まれているフォルダーのタイプは、パスの変更後に MATLAB がクラス定義を更新する方法に影響します。新しい定義がクラス フォルダー (@ フォルダー) に含まれている場合、MATLAB はクラス定義をすぐに更新します。しかし、パス フォルダーに定義されているクラスの場合、MATLAB で新しい定義が認識されるようにするには、その前に古い定義をクリアする必要があります。

参考

トピック