動的プロパティ — インスタンスへのプロパティの追加
動的プロパティとは
dynamicprops クラスから派生したクラスのインスタンスにプロパティを追加できます。これらの動的プロパティは、インスタンス プロパティと呼ばれることもあります。動的プロパティを使用すると、一時データをオブジェクトに付加したり、クラスのすべてのオブジェクトではなく 1 つのインスタンスに関連付けるデータを代入したりできます。
複数のプログラムが、同じオブジェクトに動的プロパティを定義することができます。このような場合、名前の競合を避けてください。動的なプロパティ名は、有効な MATLAB® 識別子 (変数名を参照) でなければならず、そのクラスのメソッドと同じ名前にすることはできません。
動的プロパティの特性
いったん定義されると、動的プロパティは、クラス定義済みのプロパティと同様に動作します。
ドット表記を使用して動的プロパティの値を設定またはクエリします。(動的プロパティへのデータの代入を参照。)
MATLAB は、動的プロパティが付加されているオブジェクトの保存時および読み込み時に動的プロパティを保存および読み込みます。(動的プロパティと ConstructOnLoadを参照。)
動的プロパティの属性を定義します。(動的プロパティ属性の設定を参照。)
既定では、動的プロパティの
NonCopyable属性はtrueに設定されています。動的プロパティを含むオブジェクトをコピーする場合、動的プロパティはコピーされません。(動的なプロパティをもつオブジェクトを参照。)プロパティの set と get アクセス メソッドを追加します。(動的プロパティの Set メソッドおよび Get メソッドを参照。)
動的プロパティ イベントをリスニングします。(動的プロパティのイベントを参照。)
制限つきの構文を使って、オブジェクト配列から動的プロパティの値にアクセスします。(Accessing Properties and Methods in Object Arraysを参照。)
動的プロパティをもつオブジェクトを比較する場合、それらのプロパティが同じ名前と値をもっていても、関数
isequalは常にfalseを返します。動的プロパティを含むオブジェクトを比較するには、クラス用にisequalをオーバーロードします。
動的プロパティの定義
dynamicprops クラスのサブクラスである任意のクラス (これはそれ自身 handle クラスのサブクラスです) は、addprop メソッドを使用して動的プロパティを定義できます。構文は、次のようになります。
P = addprop(H,'PropertyName')ここで以下のようになります。
P は matlab.metadata.DynamicProperty オブジェクトの配列です。
H はハンドルの配列です。
PropertyName は、各オブジェクトに追加している動的プロパティの名前です。
動的プロパティの命名
動的プロパティを命名するときは、有効な名前のみを使用します(変数名を参照)。また、次のような名前は使用 "しないで" ください。
クラス メソッドと同じ名前
クラス イベントと同じ名前
ピリオド (
.) を含む名前配列機能をサポートする関数の名前 (
empty、transpose、ctranspose、permute、reshape、display、disp、details、またはsort)。
動的プロパティ属性の設定
プロパティ属性を設定するには、動的プロパティに関連付けられている matlab.metadata.DynamicProperty オブジェクトを使用します。たとえば、P が addprop から返されたオブジェクトの場合、次のステートメントはプロパティの Hidden 属性を true に設定します。
P.Hidden = true;
プロパティの属性 Constant および Abstract は、動的プロパティには意味がなくなります。これらの属性の値を true に設定しても、効果はありません。
動的プロパティの削除
以下のように matlab.metadata.DynamicProperty オブジェクトを削除して、動的プロパティを削除します。
delete(P);
動的プロパティへのデータの代入
たとえば、事前定義された一連のユーザー インターフェイス ウィジェット クラス (ボタン、スライダー、チェック ボックスなど) を使用しているとします。ウィジェット クラスの各インスタンスの位置を保存するとします。このウィジェット クラスは、特定のレイアウト スキームの位置データを保存するように設計されておらず、この情報を別途保持するために、マップやハッシュ テーブルは作成しないものとします。
button クラスが dynamicprops のサブクラスである場合には、レイアウト データを保存するために動的プロパティを追加します。uicontrol ボタンを作成する単純なクラスを以下に示します。
classdef button < dynamicprops properties UiHandle end methods function obj = button(pos) if nargin > 0 if length(pos) == 4 obj.UiHandle = uicontrol('Position',pos,... 'Style','pushbutton'); else error('Improper position') end end end end end
button クラスのインスタンスを作成し、動的プロパティを追加し、プロパティ値を設定します。
b1 = button([20 40 80 20]);
b1.addprop('myCoord');
b1.myCoord = [2,3];動的プロパティには他の任意のプロパティと同様にアクセスしますが、これは、動的プロパティが定義されたオブジェクト上に限られます。
b1.myCoord
ans =
2 3動的プロパティの Access 属性
動的プロパティで非パブリックの Access を使用することは推奨されません。その理由は、多くの場合クラス メソッドの外部で作成される特定のインスタンスにこれらのプロパティが属するためです。動的プロパティの Access 属性は、動的プロパティを含むインスタンスのクラスに対して適用されます。動的プロパティの Access 属性は、動的プロパティを追加するメソッドをもつクラスに適用されるとは限りません。
たとえば、基底クラスのメソッドがプライベート アクセスをもつ動的プロパティをインスタンスに追加する場合、プライベート アクセスはそのインスタンスのクラスにのみ適用されます。
動的プロパティの属性の詳細については、matlab.metadata.DynamicProperty を参照してください。matlab.metadata.DynamicProperty オブジェクトを取得するには、ハンドルの findprop メソッドを使用します。
オブジェクトの動的プロパティのリスト
ハンドルの findprop メソッドを使用して、オブジェクトの動的プロパティをリストできます。以下に手順を示します。
関数
propertiesを使用して、オブジェクトのプロパティ名を取得します。findpropを使用して、各プロパティのメタデータ オブジェクトを取得します。関数
isaを使用して、メタデータ オブジェクトがmatlab.metadata.DynamicPropertyオブジェクトかどうかを判別します。そうである場合、プロパティは動的プロパティです。
関数 getDynamicPropNames は、入力 obj に定義された動的プロパティの名前を表示する方法を示します。
function getDynamicPropNames(obj) % Find dynamic properties allprops = properties(obj); for i=1:numel(allprops) m = findprop(obj,allprops{i}); if isa(m,'matlab.metadata.DynamicProperty') disp(m.Name) end end end