Main Content

動的プロパティ — インスタンスへのプロパティの追加

動的プロパティとは

dynamicprops クラスから派生したクラスのインスタンスにプロパティを追加できます。これらの動的プロパティは、インスタンス プロパティと呼ばれることもあります。動的プロパティを使用すると、一時データをオブジェクトに付加したり、クラスのすべてのオブジェクトではなく 1 つのインスタンスに関連付けるデータを代入したりできます。

複数のプログラムが、同じオブジェクトに動的プロパティを定義することができます。このような場合、名前の競合を避けてください。動的なプロパティ名は、有効な MATLAB® 識別子 (変数名を参照) でなければならず、そのクラスのメソッドと同じ名前にすることはできません。

動的プロパティの特性

いったん定義されると、動的プロパティは、クラス定義済みのプロパティと同様に動作します。

動的プロパティの定義

dynamicprops クラスのサブクラスである任意のクラス (これはそれ自身 handle クラスのサブクラスです) は、addprop メソッドを使用して動的プロパティを定義できます。構文は、次のようになります。

P = addprop(H,'PropertyName')

ここで以下のようになります。

Pmatlab.metadata.DynamicProperty オブジェクトの配列です。

H はハンドルの配列です。

PropertyName は、各オブジェクトに追加している動的プロパティの名前です。

動的プロパティの命名

動的プロパティを命名するときは、有効な名前のみを使用します(変数名を参照)。また、次のような名前は使用 "しないで" ください。

  • クラス メソッドと同じ名前

  • クラス イベントと同じ名前

  • ピリオド (.) を含む名前

  • 配列機能をサポートする関数の名前 (emptytransposectransposepermutereshapedisplaydispdetails、または sort)。

動的プロパティ属性の設定

プロパティ属性を設定するには、動的プロパティに関連付けられている matlab.metadata.DynamicProperty オブジェクトを使用します。たとえば、Paddprop から返されたオブジェクトの場合、次のステートメントはプロパティの 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

関連するトピック