主要内容

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

変更済みクラスの自動更新

MATLABがクラス定義を読み込む場合

MATLAB®は,以下の場合にクラス定義を読み込みます。

  • インスタンスの作成,定数プロパティへのアクセス,クラスの静的メソッドの呼び出しなど,クラスが最初に参照されたとき。

  • 読み込まれたクラスの定義が変更され,MATLABがコマンドプロンプトに戻ったとき。

  • MATLABパスを変更したために,使用するクラスの定義が変わってしまったとき。変更は,MATLABがコマンドプロンプトに戻った後に有効になる。

  • クラスのメタデータにアクセスするときに常時。

MATLABでは1つのクラスにつき一度に1つの定義しか使用できません。このため、MATLABはそのクラスのすべての既存オブジェクトが新しいクラス定義に自動的に準拠するよう更新を試みます。既存のオブジェクトの定義クラスを変更するとき,明确的类を呼び出してそれらのオブジェクトを削除する必要はありません。

メモ

MATLABエディター以外のエディターまたはMATLAB在线™を使用すると,自動更新が遅れる可能性があります。

自動更新の結果

MATLABは,既存のオブジェクトを更新するとき基本的な一連のルールに従います。自動更新により生じる結果には以下があります。

  • 既存のオブジェクトが新しいクラス定義に更新されます。

  • MATLABがオブジェクトを新しいクラス定義に変換できないか,クラス定義自体にエラーがある場合,エラーになります。

次の例は,具象クラスのインスタンスを作成した後,そのクラスの定義を編集して抽象クラスにすると何が起こるかを示しています。

一个= MyClass;%编辑MyClass,使其为抽象一个
不能更新对象,因为类'MyClass'现在是抽象的。

メモ

MATLABは,クラス定義が変更されてもメタクラスインスタンスを更新しません。クラス定義の更新後に新しいメタクラスデータを取得しなければなりません。

クラス定義が変更された場合

MATLABは,以下の状況を含むクラス定義の変更時に,既存オブジェクトの更新を行います。

  • ハンドルする値の変更——既存のオブジェクトは,異なるオブジェクトを参照する独立ハンドルになります。

  • 列挙メンバーの追加——既存のオブジェクトは,列挙メンバーの基となる値が変化しても,以前の列挙メンバーを保持します。

  • 列挙メンバーの削除——削除されたメンバーを使用しない既存のオブジェクトは,以前と同じ列挙メンバーをもちます。削除されたメンバーを使用する既存のオブジェクトは,削除されたメンバーを列挙型の既定のメンバーで置き換えます。

  • 列挙型ブロックの削除-列挙メンバーは使用されなくなります。

  • スーパークラス定義の変更——変更はそのスーパークラスの階層内のすべてのサブクラスに適用されます。

  • スーパークラスの追加または削除——スーパークラスの変更がすべての既存のオブジェクトに適用されます。

定義フォルダーをスコープ内に確実に保持

MATLABパスを変更することにより,そのパスからクラス定義ファイルが削除されると,一時的にでも副次的な影響が発生することがあります。関数がクラス定義を含む現在のフォルダーから変更され、そのフォルダーがパス上にない場合、その関数はスコープ外となったクラスのメソッドを呼び出すことができなくなります。潜在的な問題を回避するには、他のフォルダーに変更する前に、クラス定義フォルダーをパスに追加します。

たとえば,入力objのクラスが現在のフォルダーに定義され,そのフォルダーがパス上にないとします。現在のフォルダーを他のフォルダーに変更する前に,関数目录を使用して現在のフォルダーをパスに追加します。

函数runFromTempFolder (obj)%添加当前文件夹到路径addpath(pwd) definingFolder = cd(“myTempFolder”);obj.myMethod;cd (definingFolder)结束

更新を引き起こさない操作

以下の操作は既存のオブジェクトを更新しません。

  • 古くなったオブジェクトへの関数の呼び出し

  • 古くなったオブジェクトの変数への代入

  • クラスデータにアクセスしないメソッドの呼び出し

  • クラス定義でのプロパティ検証の変更(プロパティ値の検証

オブジェクトは,オブジェクト表示の呼び出しやプロパティへの割り当てなど,変更が明らかになる方法で参照されない限り更新されません。

クラス定義の複数の更新

更新はインクリメント形式では行われません。更新はクラスの最新バージョンに準拠します。

クラスファイルの削除によるオブジェクトの有効性

クラス定義ファイルを削除しても,そのクラスのインスタンスは無効になりません。ただし,そのクラスの既存のオブジェクトでメソッドを呼び出すことはできません。

更新が不可能な場合

クラスの更新によりクラス定義が無効になることがあります。そのような場合,エラーが解決されるまでオブジェクトは更新されません。

  • スーパークラスを追加すると,プロパティまたはメソッドが2度定義されることがあります。

  • サブクラスの1つにオブジェクトが存在する場合にそのスーパークラスを密封に変更すると,サブクラス定義が無効になることがあります。

クラスの更新によっては,MATLABが既存のオブジェクトを,変更されたクラス定義に準拠するように更新できない,という状況が発生します。次のような場合,オブジェクトを削除するまでエラーの原因となります。

  • 枚举ブロックを非列挙クラスに追加

  • クラスを抽象クラスとして再定義

  • 異種混合階層からクラスを削除(その結果,異種混合配列内の既存のオブジェクトに置き換わる既定のオブジェクトが存在しない)

  • 配列インデックス付けのオーバーロードや連結など,配列の形成動作を制限するためにクラスを更新

  • subsrefsubsasgnvertcatまたはhorzcatメソッドを継承

  • ハンドルクラスを値クラスとして再定義

クラスの更新により起こりうる結果

  • 更新の後,既存のオブジェクトが新しいクラス定義と互換性がなくなる場合があります。たとえば,新たに追加されたプロパティを有効にするには,コンストラクターの実行が必要な場合があります。

  • プロパティを削除したり名前を変更すると,そのプロパティのもつデータが失われる場合があります。たとえば,他のオブジェクトへの唯一の参照があるプロパティをクラスから削除すると,そのオブジェクトへの参照がなくなるのでMATLABはそのオブジェクトを削除します。

  • 異種混合クラス階層からクラスを削除すると,異種混合配列要素が無効になる場合があります。この場合,それらの配列要素はその異種混合階層の既定のオブジェクトで置き換えられます。

デバッガーの操作

R2021a以降"

MATLABは,クラスの更新中にデバッガーを無効にします。R2021aより前は、ブレークポイントによってクラス更新プロセスが中断される可能性があり、更新の再開時に誤差が生じることがあります。

たとえば,このクラスは次のプロパティ検証関数を定義します。

classdefClassWithBreakpoint属性(恒)Prop1(1,1) {myPropertyValidator}结束结束函数myPropertyValidator (~)结束%在这里添加断点
このクラスのインスタンスを作成します。次に,指示がある場所にブレークポイントを追加し,初期値が含まれるようにProp1の定義を更新します。
Prop1 (1,1) {myPropertyValidator} = 32
R2020b以前のバージョンでは,MATLABがブレークポイントにヒットすると,クラスの更新が中断されます。R2021aでは,デバッガーは無効になっているため,ブレークポイントによって更新が中断されることはありません。

クラス属性の更新

クラス属性の変更により,既存オブジェクトの動作が変化したり,オブジェクトが無効になったりする場合があります。無効なオブジェクトにアクセスすると,MATLABはエラーを返します。

変更 結果

摘要= trueに設定

既存オブジェクトにアクセスすると,エラーが返されます。

AllowedSubclassesを変更

新しく作成されるオブジェクトが既存オブジェクトからではなく,別のスーパークラスから継承される場合があります。

ConstructOnLoadを変更

クラスの読み込みはConstructOnLoadの現在の値に従います。

HandleCompatibleを変更

新しく作成されるオブジェクトが既存オブジェクトとは異なるクラス階層をもつ場合があります。

隐藏的を変更

スーパークラスのリスト内でのクラスの外観と関数帮助によるアクセスが変更される場合があります。

InferiorClassesを変更

既存オブジェクトのメソッドディスパッチングが変更される場合があります。

密封= trueに設定

既存のサブクラスオブジェクトにアクセスするとエラーが返されます。

プロパティ定義の更新

クラスプロパティの定義を変更すると,MATLABはその変更をクラス内の既存のオブジェクトに適用します。

変更 結果

プロパティの追加

クラスの既存のオブジェクトに新しいプロパティが追加されます。プロパティ値が既定値に設定されます(クラス定義に既定値が指定されていない場合は[])。

プロパティの削除

クラスの既定のオブジェクトからプロパティが削除されます。削除されたプロパティにアクセスする試みが失敗します。

プロパティの既定値の変更

クラスの既存のオブジェクトには新しい既定値は適用されません。

サブクラスとスーパークラス間でのプロパティの移動

プロパティの定義がスーパークラスとサブクラスの間で動かされても,異なる既定値は適用されません。

プロパティの属性値の変更

クラスの既存のオブジェクトに変更が適用されます。

以下の中間手順が必要な場合があります。

  • 摘要——クラスが抽象になる既存のオブジェクトは更新できません。これらのオブジェクトは削除してください。

  • 访问- - - - - -公共受保护的または私人プロパティのアクセス設定への変更は,既存オブジェクトへのアクセスに影響します。

    アクセスリストへの変更は既存のオブジェクトに影響しません。ただし,クラスをアクセスリストに追加すると,それらのクラスのインスタンスはこのプロパティにアクセスできるようになります。クラスをアクセスリストから削除すると,それらのクラスのオブジェクトはこのプロパティにアクセスできなくなります。

  • 依赖- - - - - -真正的に変更すると,既存のオブジェクトはプロパティ値を保存しなくなります。プロパティ値をクエリするには,そのプロパティの得到メソッドを追加します。

  • 瞬态- - - - - -真正的に変更すると,既に保存されているオブジェクトはこのプロパティ値を再読み込みします。に変更すると,既に保存されているオブジェクトは既定値を使ってこのプロパティを再読み込みします。

メソッド定義の更新

クラスメソッドの定義を変更すると,MATLABは既存のオブジェクト内で影響を受けるクラスメンバーを次のように変更します。

変更 結果

メソッドの追加

このクラスの既存のオブジェクトで新しいメソッドが呼び出せます。

メソッドの変更

変更内容が既存のオブジェクトで利用可能になります。

メソッドの削除

削除されたメソッドを既存のオブジェクトで呼び出せなくなります。

メソッド属性値の変更

クラスの既存のオブジェクトに変更が適用されます。

以下の中間手順が必要な場合があります。

  • 摘要——クラスが抽象になる既存のオブジェクトは更新できません。これらのオブジェクトは削除してください。

  • 访问——メソッド公共受保护的または私人のアクセス設定への変更は,既存オブジェクトへのアクセスに影響します。

    アクセスリストへの変更は既存のインスタンスに影響しません。ただし,クラスをアクセスリストに追加すると,それらのクラスのインスタンスはこのメソッドにアクセスできるようになります。クラスをアクセスリストから削除すると,それらのクラスのオブジェクトはこのメソッドにアクセスできなくなります。

  • 密封- - - - - -真正的に変更され,既存のサブクラスによってメソッドが既に定義されている場合,新しいクラス定義を既存のサブクラスに適用できないためMATLABはエラーを返します。

イベント定義の更新

変更 結果

イベントの追加

クラスの既存オブジェクトは新しいイベントをサポートします。

イベント名の変更

新しいイベント名はクラスの既存のオブジェクトに認識されます。MATLABは,

  • 既存のメタクラスオブジェクトを更新しない

  • 新たに取得されたメタクラスオブジェクトを更新する

  • 新しいイベント名を使用するためのリスナー更新は行わない

イベントの削除

既存のオブジェクトは削除されたイベントをサポートしなくなります。

イベント属性値の変更

クラスの既存のオブジェクトに変更が適用されます。

以下の中間手順が必要な場合があります。

  • ListenAccess——イベント公共受保护的または私人の听アクセス設定への変更は既存のオブジェクトへのアクセスに影響します。

    アクセスリストへの変更は既存のオブジェクトには影響しません。ただし,アクセスリストにクラスを追加すると,これらのクラスのオブジェクトはこのイベントのリスナーを作成できます。アクセスリストからクラスを削除すると,これらのクラスのオブジェクトはこのイベントのリスナーを作成できません。

  • NotifyAccess- - - - - -公共受保护的または私人の通知アクセス設定への変更は既存オブジェクトに影響します。

    アクセスリストへの変更は既存のオブジェクトには影響しません。アクセスリストにクラスを追加すると,これらのクラスのインスタンスはこのイベントをトリガーできます。クラスを削除すると,これらのクラスのオブジェクトはこのイベントをトリガーできません。

関連するトピック