動的プロパティ — インスタンスへのプロパティの追加
動的プロパティとは
dynamicprops
クラスから派生したクラスのインスタンスにプロパティを追加できます。これらの動的プロパティは、インスタンス プロパティと呼ばれることもあります。動的プロパティを使用すると、一時データをオブジェクトに付加したり、クラスのすべてのオブジェクトではなく 1 つのインスタンスに関連付けるデータを代入したりできます。
複数のプログラムが、同じオブジェクトに動的プロパティを定義することができます。このような場合、名前の競合を避けてください。動的なプロパティ名は、有効な MATLAB® 識別子 (変数名を参照) でなければならず、そのクラスのメソッドと同じ名前にすることはできません。
動的プロパティの特性
いったん定義されると、動的プロパティは、クラス定義済みのプロパティと同様に動作します。
ドット表記を使用して動的プロパティの値を設定またはクエリします。(動的プロパティへのデータの代入を参照。)
MATLAB は、動的プロパティが付加されているオブジェクトの保存時および読み込み時に動的プロパティを保存および読み込みます。(動的プロパティと ConstructOnLoadを参照。)
動的プロパティの属性を定義します。(動的プロパティ属性の設定を参照。)
既定では、動的プロパティの
NonCopyable
属性はtrue
に設定されています。動的プロパティを含むオブジェクトをコピーする場合、動的プロパティはコピーされません。(動的なプロパティをもつオブジェクトを参照。)プロパティの set と get アクセス メソッドを追加します。(動的プロパティの Set メソッドおよび Get メソッドを参照。)
動的プロパティ イベントをリスニングします。(動的プロパティのイベントを参照。)
制限つきの構文を使って、オブジェクト配列から動的プロパティの値にアクセスします。(配列の動的プロパティへのアクセスを参照。)
動的プロパティをもつオブジェクトを比較する場合、それらのプロパティが同じ名前と値をもっていても、関数
isequal
は常にfalse
を返します。動的プロパティを含むオブジェクトを比較するには、クラス用にisequal
をオーバーロードします。
動的プロパティの定義
dynamicprops
クラスのサブクラスである任意のクラス (これはそれ自身 handle
クラスのサブクラスです) は、addprop
メソッドを使用して動的プロパティを定義できます。構文は、次のようになります。
P = addprop(H,'PropertyName')
ここで、
P
は meta.DynamicProperty
オブジェクトの配列です。
H
はハンドルの配列です。
PropertyName
は、各オブジェクトに追加している動的プロパティの名前です。
動的プロパティの命名
動的プロパティを命名するときは、有効な名前のみを使用します(変数名を参照)。また、次のような名前は使用 "しないで" ください。
クラス メソッドと同じ名前
クラス イベントと同じ名前
ピリオド (
.
) を含む名前配列機能をサポートする関数の名前 (
empty
、transpose
、ctranspose
、permute
、reshape
、display
、disp
、details
、またはsort
)。
動的プロパティ属性の設定
プロパティ属性を設定するには、動的プロパティに関連付けられている meta.DynamicProperty
オブジェクトを使用します。たとえば、P
が addprop
から返されたオブジェクトの場合、次のステートメントはプロパティの Hidden
属性を true
に設定します。
P.Hidden = true;
プロパティの属性 Constant
および Abstract
は、動的プロパティには意味がなくなります。これらの属性の値を true
に設定しても、効果はありません。
動的プロパティの削除
以下のように meta.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 属性は、動的プロパティを追加するメソッドをもつクラスに適用されるとは限りません。
たとえば、基底クラスのメソッドがプライベート アクセスをもつ動的プロパティをインスタンスに追加する場合、プライベート アクセスはそのインスタンスのクラスにのみ適用されます。
動的プロパティの属性の詳細については、meta.DynamicProperty
を参照してください。meta.DynamicProperty
オブジェクトを取得するには、ハンドルの findprop
メソッドを使用します。
オブジェクトの動的プロパティのリスト
ハンドルの findprop
メソッドを使用して、オブジェクトの動的プロパティをリストできます。以下に手順を示します。
関数
properties
を使用して、オブジェクトのプロパティ名を取得します。findprop
を使用して、各プロパティのメタデータ オブジェクトを取得します。関数
isa
を使用して、メタデータ オブジェクトがmeta.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,'meta.DynamicProperty') disp(m.Name) end end end