クラス定義を含むフォルダー
パス上のクラス定義
クラス メソッドを呼び出すためには、次のセクションで説明するように、MATLAB® パス上にクラス定義がなければなりません。
クラスおよびパス フォルダー
クラス定義ファイルを含むことができるフォルダーは 2 種類あります。
パス フォルダー — フォルダーは MATLAB パス上にあり、フォルダー名は
@
記号以外の文字で始まります。1 つのフォルダーに複数のクラスと関数を配置する場合に、このタイプのフォルダーを使用します。クラス定義全体が 1 つのファイル内になければなりません。クラス フォルダー — フォルダー名は @ 記号で始まり、それにクラス名が続きます。このフォルダー自体は MATLAB パス上にありませんが、親フォルダーが MATLAB パス上にあります。1 つのクラス定義で複数のファイルを使用する場合に、このタイプのフォルダーを使用します。
MATLAB パスの詳細は、「path
」を参照してください。
パス フォルダーの使用
クラス定義ファイルを含むフォルダーは MATLAB パス上にあります。したがって、パス フォルダーにあるクラス定義の優先順位は、通常の関数と同じです。MATLAB パス上で最初にある名前のものが、同じ名前の後続のものより優先されます。
各クラス定義ファイルの名前は、classdef
キーワードで指定されたクラスの名前に一致していなければなりません。パス フォルダーを使用すると、クラスごとに独立したクラス フォルダーを作成する必要がなくなります。ただし、すべてのメソッドを含め、クラス定義全体が 1 つのファイルに含まれていなければなりません。
1 つのフォルダーに 3 つのクラスが定義されているとします。
.../path_folder/MyClass1.m .../path_folder/MyClass2.m .../path_folder/MyClass3.m
これらのクラスを使用するには、MATLAB パスに path_folder
を追加します。
addpath path_folder
クラス フォルダーの使用
クラス フォルダーの名前は必ず @
記号で始まり、その後にフォルダー名としてクラス名が続きます。クラス フォルダーはパス フォルダー内になければなりませんが、クラス フォルダーは MATLAB パス上にはありません。クラス定義ファイルはクラス フォルダー内に配置します。このフォルダーには他のメソッド ファイルを含めることもできます。クラス定義ファイルは、クラス フォルダー (@
記号を除く) と同じ名前でなければなりません。
.../parent_folder/@MyClass/MyClass.m .../parent_folder/@MyClass/myMethod1.m .../parent_folder/@MyClass/myMethod2.m
各フォルダーにクラスを 1 つだけ定義します。ファイルはすべて .m
または .p
拡張子をもちます。MATLAB Version R2018a 以降では、.mlx
拡張子が付いたライブ関数をスタンドアロンのメソッドにすることができます。
クラス定義に複数のファイルを使用する場合は、クラス フォルダーを使用します。MATLAB はクラス フォルダー内のすべての関数ファイルをそのクラスのメソッドとして扱います。関数ファイルには MATLAB コード (.m
)、ライブ コード ファイル形式 (.mlx
)、MEX 関数 (プラットフォーム依存の拡張子)、および P コード ファイル (.p
) を使用できます。
MATLAB はクラス フォルダー内のすべてのファイルをそのクラスのメソッドとして明示的に特定します。これにより、クラスのオーサリング メソッドに対してよりモジュール化されたアプローチを使用できます。
各ファイルのベース名は、有効な MATLAB 関数名でなければなりません。有効な関数名は、アルファベットで始まり、文字、数字またはアンダースコアを含むことができます。詳細については、別ファイルのメソッドを参照してください。
クラス フォルダー内の private フォルダー内の関数
private フォルダーには、その private
フォルダーのすぐ上のフォルダーで定義されている関数だけからアクセスできる関数が含まれています。クラス フォルダー内の private
フォルダーで定義されているすべての関数は、そのクラスのメソッドからのみ呼び出すことができます。この関数は、クラスのプライベートなメンバーにアクセスできますが、それ自体はメソッドではありません。この関数は、入力として渡すオブジェクトを必要とせず、関数表記を使用してのみ呼び出すことができます。クラスの複数のメソッドから呼び出すことができる補助関数を必要とする場合、private
フォルダー内の関数を使用します。
クラス フォルダーに private
フォルダーが含まれている場合は、private
フォルダーで定義されている関数にアクセスできるのは、このクラス フォルダーに定義されているクラスのみです。サブクラスは、スーパークラスのプライベート関数にはアクセスできません。private フォルダーの詳細については、プライベート関数を参照してください。
スーパークラスのプライベート関数にサブクラスからアクセスできるようにするには、その関数をスーパークラスの保護されたメソッドとして定義します。Access
属性を protected
に設定してメソッドを指定します。
private フォルダー内のメソッドへのディスパッチング
クラスがクラス フォルダー内に存在する private
フォルダー内で関数を定義している場合、MATLAB は以下の優先順位規則に従って、プライベート関数または classdef
ファイルのメソッドにディスパッチします。
ドット表記 (
obj.methodName
) を使用すると、private
フォルダー内の関数がclassdef
内で定義されているメソッドより優先されます。関数表記 (
methodName(obj)
) を使用すると、classdef
ファイル内で定義されているメソッドがprivate
フォルダー内の関数より優先されます。
private フォルダーにクラス定義は禁止
private フォルダーにクラス定義 (classdef
ファイル) を配置することはできません。これを行うと、クラス フォルダーまたはパス フォルダーの要件が満たされなくなるためです。
クラスの優先順位と MATLAB パス
同じ名前をもつ複数のクラス定義がある場合、MATLAB パス上のファイルの場所で優先順位が決まります。定義がクラス フォルダー内にあるかどうかにかかわらず、MATLAB パス上で最初に出現するフォルダー内のクラス定義は常に、パス上でそれよりも後のクラスよりも優先されます。
パス フォルダー内のクラスと同じ名前をもつ関数は、その関数がパス上で前の位置にあるフォルダー内に存在する場合、そのクラスよりも優先されます。ただし、クラス フォルダー (@-folder) 内で定義されるクラスは、同じ名前の関数がパス上で前の位置にあるフォルダー内で定義されている場合でも、その関数よりも優先されます。
たとえば、次のフォルダーとファイルを含むパスを考えてみましょう。
パス内での順序 | フォルダーとファイル | ファイル定義 |
---|---|---|
1 |
| クラス |
2 |
| 関数 |
3 |
| クラス |
4 |
| メソッド |
5 |
| クラス |
MATLAB は、どのバージョンの Foo
を呼び出すかを決定するためにこのロジックを適用します。
以下の理由により、クラス fldr1/Foo.m
はクラス fldr3/@Foo
より優先されます。
パス上で
fldr1
がfldr3
の前にあり、fldr1/Foo.m
はクラスである
以下の理由により、クラス fldr3/@Foo
は関数 fldr2/Foo.m
より優先されます。
fldr3/@Foo
はクラス フォルダー内のクラスであるfldr2/Foo.m
はクラスではないクラス フォルダー内のクラスは関数より優先される
以下の理由により、関数 fldr2/Foo.m
はクラス fldr5/Foo.m
より優先されます。
パス上で
fldr2
がクラスfldr5
より前にあるfldr5/Foo.m
はクラス フォルダーにないクラス フォルダー内で定義されていないクラスは、関数に関してはパスの順序に従う
以下の理由により、クラス fldr3/@Foo
は fldr4/@Foo
より優先されます。
パス上で
fldr3
がfldr4
の前にある
fldr3/@Foo/Foo.m
に Version 7.6 より前に作成された MATLAB クラスが含まれる場合 (つまり、クラスが classdef
キーワードを使用しない場合)、fldr4/@Foo/bar.m
が fldr3/@Foo
で定義された Foo
クラスのメソッドになります。
クラス フォルダーで定義されたクラスの旧バージョンでの動作
MATLAB Version 5 ~ 7 では、クラス フォルダーによって後方のパス フォルダーにある同じ名前の別のクラス フォルダーが隠されることはありません。代わりに、同じ名前をもつすべてのクラス フォルダーからのメソッドの組み合わせを使用することによって、クラスを定義します。この動作はサポートされなくなりました。
下位互換性を確保するために、クラス フォルダーで定義されたクラスは、同じ名前をもつ関数やスクリプトよりも常に優先されます。この優先順位は、パス上のこれらのクラスの前にある関数とスクリプトに適用されます。
パスの変更によるクラス定義の更新
MATLAB が現在の定義として認識できるのは 1 つのクラス定義のみです。MATLAB パスを変更することにより、クラスの定義ファイルを変更できます (path
を参照)。古い定義のインスタンスが存在しない場合 (つまり、古い定義がパス上で最初に出現しない)、MATLAB はすぐに新しいフォルダーを現在の定義として認識します。ただし、パスの変更前にクラスの既存のインスタンスが存在する場合、MATLAB が新しいフォルダー内の定義を使用するかどうかは、新しいクラスの定義方法によって決まります。新しい定義がクラス フォルダー内で定義されている場合、MATLAB はすぐに新しいフォルダーを現在のクラス定義として認識します。ただし、パス フォルダーで定義されているクラスの場合 (つまり、クラス @
フォルダーで定義されていない場合)、MATLAB が新しいフォルダーを現在のクラス定義として認識する前にクラスをクリアしなければなりません。
クラス フォルダー内のクラス定義
2 つのフォルダー fldA
と fldB
で Foo
という名前の 2 つのバージョンのクラスを定義するとします。
fldA/@Foo/Foo.m fldB/@Foo/Foo.m
フォルダー fldA
をパスの先頭に追加します。
addpath fldA
クラス Foo
のインスタンスを作成します。MATLAB はクラス定義として fldA/@Foo/Foo.m
を使用します。
a = Foo;
現在のフォルダーを fldB
に変更します。
cd fldB
現在のフォルダーは常にパスの先頭になります。したがって、MATLAB は fldB/@Foo/Foo.m
をクラス Foo
の定義として検出します。
b = Foo;
MATLAB は既存のインスタンス a
を自動的に更新し、fldB
にある新しいクラス定義を使用します。
パス フォルダー内のクラス定義
2 つのフォルダー fldA
と fldB
で Foo
という名前の 2 つのバージョンのクラスを定義するとします。ただし、クラス フォルダーは使用しません。
fldA/Foo.m fldB/Foo.m
フォルダー fldA
をパスの先頭に追加します。
addpath fldA
クラス Foo
のインスタンスを作成します。MATLAB はクラス定義として fldA/Foo.m
を使用します。
a = Foo;
現在のフォルダーを fldB
に変更します。
cd fldB
現在のフォルダーが事実上パスの先頭になります。ただし、MATLAB は fldB/Foo.m
をクラス Foo
の定義として識別しません。MATLAB は、クラスがクリアされるまで、元のクラス定義を使用し続けます。
foldB
の Foo
の定義を使用するには、Foo
をクリアします。
clear Foo
MATLAB は fldB
のクラス定義に従うために、既存のオブジェクトを自動的に更新します。通常、インスタンス変数をクリアする必要はありません。