ドキュメンテーション

最新のリリースでは、このページがまだ翻訳されていません。 このページの最新版は英語でご覧になれます。

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

パス上のクラス定義

クラス メソッドを呼び出すためには、次のセクションで説明するように、MATLAB® パス上にクラス定義がなければなりません。

クラスおよびパス フォルダー

クラス定義ファイルを含むことができるフォルダーは 2 種類あります。

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

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

MATLAB パスの詳細は、「path」を参照してください。

パス フォルダーの使用

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

各クラス定義ファイルの名前は、classdef キーワードで指定されたクラスの名前に一致していなければなりません。パス フォルダーを使用すると、クラスごとに独立したクラス フォルダーを作成する必要がなくなります。ただし、すべてのメソッドを含め、クラス定義全体が 1 つのファイルに含まれていなければなりません。

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

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

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

addpath path_folder

クラス フォルダーの使用

クラス フォルダー名は必ず @ 記号で始まり、その後にフォルダー名としてクラス名が続きます。クラス フォルダーはパス フォルダー内になければなりませんが、クラス フォルダーは MATLAB パス上にはありません。クラス定義ファイルはクラス フォルダー内に配置します。このフォルダーには他のメソッド ファイルを含めることもできます。クラス定義ファイルは、クラス フォルダー (@ 記号を除く) と同じ名前でなければなりません。クラス定義は classdef キーワードで始まり、ファイル内で他のコード (コードを構成しない空白とコメントは除く) より前になければなりません。

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

各フォルダーにクラスを 1 つだけ定義します。すべてのファイルの拡張子は .m でなければなりません。

クラス定義に複数のファイルを使用する場合は、クラス フォルダーを使用します。MATLAB はクラス フォルダー内のすべての .m ファイルをそのクラスのメソッドとして扱います。クラス ファイルには、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 パス上のファイルの場所でファイルの優先順位が決まります。クラス フォルダー内にあるかどうかにかかわらず、パス上でクラスの前にあるクラス定義ファイルはすべて優先されます。パス上で後ろにあるすべてのクラス定義ファイルに対しては、クラスのほうが優先されます。

たとえば、次のファイルを含むフォルダーのパスを考えてみましょう。

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

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 より優先されます。

  • パス上で fldr1/Foo.mfldr3/@Foo の前にある

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

  • fldr3/@Foo はクラス フォルダー内のクラスである

  • fldr2/Foo.m はクラスではない

  • クラス フォルダー内のクラスは関数より優先される

以下の理由により、関数 fldr2/Foo.m はクラス fldr5/Foo.m より優先されます。

  • パス上で fldr2/Foo.m がクラス fldr5/Foo.m より前にある

  • fldr5/Foo.m はクラス フォルダーにない

  • クラス フォルダー内で定義されていないクラスは、関数に関してはパスの順序に従う

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

  • メソッド bar は、fldr3/@Foo で定義された Foo の一部とは認識されない

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

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

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

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

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

MATLAB パスを変更することにより、クラスのクラス定義ファイルを変更できます (path を参照)。ただし、パス フォルダーで定義されているクラスの場合 (つまり、クラス @ フォルダーで定義されていない場合)、MATLAB が新しいフォルダーを現在のクラス定義として認識する前にクラスをクリアしなければなりません。

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

2 つのフォルダー fldAfldBFoo という名前の 2 つのバージョンのクラスを定義するとします。

fldA/+FooPkg/@Foo/Foo.m
fldB/+FooPkg/@Foo/Foo.m

フォルダー fldA をパスの先頭に追加します。

addpath fldA

クラス FooPkg.Foo のインスタンスを作成します。MATLAB はクラス定義として fldA/+FooPkg/@Foo/Foo.m を使用します。

a = FooPkg.Foo;

現在のフォルダーを fldB に変更します。

cd fldB

現在のフォルダーは常にパスの先頭になります。したがって、MATLAB は fldB/+FooPkg/@Foo/Foo.m をクラス FooPkg.Foo の定義として検出します。

b = FooPkg.Foo;

MATLAB は既存のインスタンス a を自動的に更新し、fldB にある新しいクラス定義を使用します。

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

2 つのフォルダー fldAfldBFoo という名前の 2 つのバージョンのクラスを定義するとします。ただし、クラス フォルダーは使用しません。

fldA/+FooPkg/Foo.m
fldB/+FooPkg/Foo.m

フォルダー fldA をパスの先頭に追加します。

addpath fldA

クラス FooPkg.Foo のインスタンスを作成します。MATLAB はクラス定義として fldA/+FooPkg/@Foo/Foo.m を使用します。

a = FooPkg.Foo;

現在のフォルダーを fldB に変更します。

cd fldB

現在のフォルダーが事実上パスの先頭になります。ただし、MATLAB は fldB/+FooPkg/Foo.m をクラス FooPkg.Foo の定義として識別しません。MATLAB は、クラスがクリアされるまで、元のクラス定義を使用し続けます。

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

clear FooPkg.Foo

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

関連するトピック