このページの翻訳は最新ではありません。ここをクリックして,英語の最新版を参照してください。
クラスメソッドを呼び出すためには,次のセクションで説明するように,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パス上で最初に出現するフォルダー内のクラス定義は常に,パス上でそれよりも後のクラスよりも優先されます。
パスフォルダー内のクラスと同じ名前をもつ関数は,その関数がパス上で前の位置にあるフォルダー内に存在する場合,そのクラスよりも優先されます。ただし,クラスフォルダー(@-folder)内で定義されるクラスは,同じ名前の関数がパス上で前の位置にあるフォルダー内で定義されている場合でも,その関数よりも優先されます。
たとえば,次のフォルダーとファイルを含むパスを考えてみましょう。
パス内での順序 | フォルダーとファイル | ファイル定義 |
---|---|---|
1 |
|
クラス |
2 |
|
関数 |
3. |
|
クラス |
4 |
|
メソッド |
5 |
|
クラス |
MATLABは,どのバージョンの喷火
を呼び出すかを決定するためにこのロジックを適用します。
以下の理由により,クラス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
7.6版本により前に作成されたMATLABクラスが含まれる場合(つまり,クラスがclassdef
キーワードを使用しない場合),fldr4 / @Foo / bar.m
がfldr3 / @Foo
で定義された喷火
クラスのメソッドになります。
MATLAB版本5 ~ 7では,クラスフォルダーによって後方のパスフォルダーにある同じ名前の別のクラスフォルダーが隠されることはありません。代わりに,同じ名前をもつすべてのクラスフォルダーからのメソッドの組み合わせを使用することによって,クラスを定義します。この動作はサポートされなくなりました。
下位互換性を確保するために,クラスフォルダーで定義されたクラスは,同じ名前をもつ関数やスクリプトよりも常に優先されます。この優先順位は,パス上のこれらのクラスの前にある関数とスクリプトに適用されます。
MATLABが現在の定義として認識できるのは1つのクラス定義のみです。MATLABパスを変更することにより、クラスの定義ファイルを変更できます (路径
を参照)。古い定義のインスタンスが存在しない場合(つまり,古い定義がパス上で最初に出現しない),MATLABはすぐに新しいフォルダーを現在の定義として認識します。ただし,パスの変更前にクラスの既存のインスタンスが存在する場合,MATLABが新しいフォルダー内の定義を使用するかどうかは,新しいクラスの定義方法によって決まります。新しい定義がクラスフォルダー内で定義されている場合,MATLABはすぐに新しいフォルダーを現在のクラス定義として認識します。ただし,パスフォルダーで定義されているクラスの場合(つまり,クラス@
フォルダーで定義されていない場合),MATLABが新しいフォルダーを現在のクラス定義として認識する前にクラスをクリアしなければなりません。
2つのフォルダーfldA
とfldB
で喷火
という名前の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つのフォルダーfldA
とfldB
で喷火
という名前の2つのバージョンのクラスを定義するとします。ただし,クラスフォルダーは使用しません。
fldA / Foo.mfldB / Foo.m
フォルダーfldA
をパスの先頭に追加します。
目录fldA
クラス喷火
のインスタンスを作成します。MATLABはクラス定義としてfldA / Foo.m
を使用します。
一个= Foo;
現在のフォルダーをfldB
に変更します。
cdfldB
現在のフォルダーが事実上パスの先頭になります。MATLABはただし,fldB / Foo.m
をクラス喷火
の定義として識別しません。MATLABは、クラスがクリアされるまで、元のクラス定義を使用し続けます。
foldB
の喷火
の定義を使用するには,喷火
をクリアします。
清晰的喷火
MATLABはfldB
のクラス定義に従うために,既存のオブジェクトを自動的に更新します。通常,インスタンス変数をクリアする必要はありません。