いくつかのプロパティとメソッドを持つ単純なMATLABクラスを作成しています。クラスのコンストラクターは、プロパティをデフォルト値で初期化します。クラスのメソッドは、クラスのプロパティを更新するために、クラスが構築された後に追加の入力を取得します。
classdef classTest
properties
p1
p2
p3
p4
end
methods
function obj = classTest()
obj.p1 = 0;
obj.p2 = 0;
obj.p3 = [];
obj.p4 = '';
end
function obj = updateSomeProperties( obj, p1 )
obj.p1 = p1;
end
end
end
ただし、クラスのメソッドを呼び出すと、プロパティが更新されません。
>> b = classTest
b =
classTest with properties:
p1: 0
p2: 0
p3: []
p4: ''
>> b.updateSomeProperties(10)
ans =
classTest with properties:
p1: 10
p2: 0
p3: []
p4: ''
>> b % still used the default values.
b =
classTest with properties:
p1: 0
p2: 0
p3: []
p4: ''
クラスのメソッドを呼び出した後、クラスオブジェクトをb
更新してもupdateSomeProperties
更新されない理由を知りたいと思いました。
問題は、クラスが(それ自体のメソッドにさえ)コピーとして渡される値クラスであるということです。これは、すべての基本的なMATLABデータ型であるため、MATLABクラスのデフォルトの動作です。への呼び出しの出力を調べることで、これが当てはまることを確認できますupdateSomeProperties()
。返された結果(として表示ans
)には、期待する変更が含まれていますが、これらの変更は元のオブジェクトには存在しませんb
。値クラスを使い続けたい場合は、メソッドから新しいオブジェクトを返し、メソッドを呼び出すときに変数を再割り当てする必要があります。
b = classTest();
b = b.updateSomeProperties(10);
必要なのは、常に参照によって渡されるハンドルクラスです。これにより、メソッドは元のオブジェクトのコピーを変更するのではなく、同じオブジェクトを操作できます。
これを行うには、組み込みhandle
クラスから継承する必要があります。
classdef classTest < handle
ドキュメントには、ハンドルクラスと値クラスの詳細な比較があります。
補足として、コンストラクターですべてのデフォルトのプロパティ値を手動で設定するのではなく、properties
ブロック自体の中でこれらのデフォルトを簡単に指定することができます。
properties
p1 = 0;
p2 = 0;
p3 = [];
p4 = '';
end
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加