Main Content

このページの翻訳は最新ではありません。ここをクリックして、英語の最新版を参照してください。

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

パス上のクラス定義

クラス メソッドを呼び出すためには、次のセクションで説明するように、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

fldr1/Foo.m

クラス Foo

2

fldr2/Foo.m

関数 Foo

3

fldr3/@Foo/Foo.m

クラス Foo

4

fldr4/@Foo/bar.m

メソッド bar

5

fldr5/Foo.m

クラス Foo

MATLAB は、どのバージョンの Foo を呼び出すかを決定するためにこのロジックを適用します。

以下の理由により、クラス fldr1/Foo.m はクラス fldr3/@Foo より優先されます。

  • パス上で fldr1fldr3 の前にあり、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/@Foofldr4/@Foo より優先されます。

  • パス上で fldr3fldr4 の前にある

fldr3/@Foo/Foo.m に Version 7.6 より前に作成された MATLAB クラスが含まれる場合 (つまり、クラスが classdef キーワードを使用しない場合)、fldr4/@Foo/bar.mfldr3/@Foo で定義された Foo クラスのメソッドになります。

クラス フォルダーで定義されたクラスの旧バージョンでの動作

MATLAB Version 5 ~ 7 では、クラス フォルダーによって後方のパス フォルダーにある同じ名前の別のクラス フォルダーが隠されることはありません。代わりに、同じ名前をもつすべてのクラス フォルダーからのメソッドの組み合わせを使用することによって、クラスを定義します。この動作はサポートされなくなりました。

下位互換性を確保するために、クラス フォルダーで定義されたクラスは、同じ名前をもつ関数やスクリプトよりも常に優先されます。この優先順位は、パス上のこれらのクラスの前にある関数とスクリプトに適用されます。

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

MATLAB が現在の定義として認識できるのは 1 つのクラス定義のみです。MATLAB パスを変更することにより、クラスの定義ファイルを変更できます (path を参照)。古い定義のインスタンスが存在しない場合 (つまり、古い定義がパス上で最初に出現しない)、MATLAB はすぐに新しいフォルダーを現在の定義として認識します。ただし、パスの変更前にクラスの既存のインスタンスが存在する場合、MATLAB が新しいフォルダー内の定義を使用するかどうかは、新しいクラスの定義方法によって決まります。新しい定義がクラス フォルダー内で定義されている場合、MATLAB はすぐに新しいフォルダーを現在のクラス定義として認識します。ただし、パス フォルダーで定義されているクラスの場合 (つまり、クラス @ フォルダーで定義されていない場合)、MATLAB が新しいフォルダーを現在のクラス定義として認識する前にクラスをクリアしなければなりません。

クラス フォルダー内のクラス定義

2 つのフォルダー fldAfldBFoo という名前の 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 つのフォルダー fldAfldBFoo という名前の 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 は、クラスがクリアされるまで、元のクラス定義を使用し続けます。

foldBFoo の定義を使用するには、Foo をクリアします。

clear Foo

MATLAB は fldB のクラス定義に従うために、既存のオブジェクトを自動的に更新します。通常、インスタンス変数をクリアする必要はありません。

関連するトピック