主要内容

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

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

パス上のクラス定義

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

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

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

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

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

MATLABパスの詳細は。”路径“を参照してください。

パスフォルダーの使用

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

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

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

…/ path_folder / MyClass1。m…/ path_folder / MyClass2。m…/ path_folder / MyClass3.m

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

目录path_folder

クラスフォルダーの使用

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

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

各フォルダーにクラスを1つだけ定義します。ファイルはすべて00または每分钟拡張子をもちます。MATLABVersion R2018a 以降では、.mlx拡張子が付いたライブ関数をスタンドアロンのメソッドにすることができます。

クラス定義に複数のファイルを使用する場合は,クラスフォルダーを使用します。MATLABはクラスフォルダー内のすべての関数ファイルをそのクラスのメソッドとして扱います。関数ファイルには MATLAB コード (00),ライブコードファイル形式(.mlx),墨西哥人関数(プラットフォーム依存の拡張子),およびPコードファイル(每分钟)を使用できます。

MATLABはクラスフォルダー内のすべてのファイルをそのクラスのメソッドとして明示的に特定します。これにより,クラスのオーサリングメソッドに対してよりモジュール化されたアプローチを使用できます。

各ファイルのベース名は,有効なMATLAB関数名でなければなりません。有効な関数名は,アルファベットで始まり,文字,数字またはアンダースコアを含むことができます。詳細については,別ファイルのメソッドを参照してください。

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

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

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

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

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

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

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

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

私人フォルダーにクラス定義は禁止

私人フォルダーにクラス定義(classdefファイル)を配置することはできません。これを行うと,クラスフォルダーまたはパスフォルダーの要件が満たされなくなるためです。

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

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

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

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

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

1

fldr1 / Foo.m

クラス喷火

2

fldr2 / Foo.m

関数喷火

3.

fldr3 / @Foo / Foo.m

クラス喷火

4

fldr4 / @Foo / bar.m

メソッド酒吧

5

fldr5 / Foo.m

クラス喷火

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

以下の理由により,クラス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.m7.6版本により前に作成されたMATLABクラスが含まれる場合(つまり,クラスがclassdefキーワードを使用しない場合),fldr4 / @Foo / bar.mfldr3 / @Fooで定義された喷火クラスのメソッドになります。

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

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

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

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

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

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

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

fldA / @Foo / Foo.mfldB / @Foo / Foo.m

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

目录fldA

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

一个= Foo;

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

cdfldB

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

b = Foo;

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

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

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

fldA / Foo.mfldB / Foo.m

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

目录fldA

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

一个= Foo;

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

cdfldB

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

foldB喷火の定義を使用するには,喷火をクリアします。

清晰的喷火

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

関連するトピック