プロパティの Set/Get インターフェイスの実装
標準の Set/Get インターフェイス
グラフィックス オブジェクトなど一部の MATLAB® オブジェクトは、関数 set および関数 get に基づいたインターフェイスを実装します。これらの関数を使うと、1 回の関数呼び出しでオブジェクトの配列の複数のプロパティにアクセスできます。
次のいずれかのクラスから派生させることにより、set と get の機能をクラスに追加することができます。
matlab.mixin.SetGet— プロパティ名の大文字と小文字を区別しない部分一致をサポートする場合に使用します。matlab.mixin.SetGetからの派生は、ドット表記によるプロパティへの参照の使用に必要とされる正確なプロパティ名には影響しません。matlab.mixin.SetGetExactNames— プロパティ名の大文字と小文字を区別する完全一致のみをサポートする場合に使用します。
メモ
この節で説明する set メソッドおよび get メソッドは、プロパティの set アクセス メソッドおよびプロパティの get アクセス メソッドとは異なります。プロパティ アクセス メソッドの詳細については、プロパティの get メソッドおよび set メソッドを参照してください。
サブクラスの構文
抽象クラス matlab.mixin.SetGet または matlab.mixin.SetGetExactNames をスーパークラスとして使用します。
classdef MyClass < matlab.mixin.SetGet ... end
matlab.mixin.SetGet と matlab.mixin.SetGetExactNames は handle クラスから派生しているため、サブクラスも同様に handle クラスとなります。
Get メソッドの構文
get メソッドは、オブジェクト ハンドルおよびプロパティ名を使用してオブジェクト プロパティの値を返します。たとえば、H がオブジェクトのハンドルとします。
v = get(H,'PropertyName');
単一プロパティ名でハンドル配列を指定すると、get は各オブジェクトのプロパティ値を値の cell 配列として返します。
CV = get(H,'PropertyName');
配列 CV は、H の形状にかかわらず常に列ベクトルです。
char ベクトル プロパティ名の cell 配列とハンドル配列を指定すると、get はプロパティ値の cell 配列を返します。セルの各行はハンドル配列のオブジェクトに対応します。セルの各列はプロパティ名に対応します。
props = {'PropertyName1','PropertyName2'};
CV = get(H,props);
get は m 行 n 列の cell 配列を返します。ここで、 m = length(H) および n = length(props) です。
ハンドル配列を指定してプロパティ名を指定しない場合は、get は struct 型の配列を返します。ここでは、配列の各構造体は H のオブジェクトに対応します。各構造体のフィールドはそれぞれ、H のクラスによって定義されるプロパティに対応します。各フィールドの値は、対応するプロパティの値です。
SV = get(H);
出力変数を割り当てない場合は、H はスカラーでなければなりません。
例については、ハンドル配列と get の使用を参照してください。
Set メソッドの構文
set メソッドは、ハンドル H をもつオブジェクトの指定のプロパティに指定値を割り当てます。H がハンドルの配列の場合は、MATLAB は値を、配列 H の各オブジェクトのプロパティに割り当てます。
set(H,'PropertyName',PropertyValue)
プロパティ名の cell 配列とプロパティ値の cell 配列を set に渡すことができます。
props = {'PropertyName1','PropertyName2'};
vals = {Property1Value,Property2Value};
set(H,props,vals)length(H) が 1 より大きい場合は、プロパティ値の cell 配列 (vals) は各オブジェクトの各プロパティに対して値をもつことができます。たとえば、length(H) が 2 (2 つのオブジェクト ハンドル) であると仮定します。各オブジェクトに 2 つのプロパティ値を割り当てるとします。
props = {'PropertyName1','PropertyName2'};
vals = {Property11Value,Property12Value;Property21Value,Property22Value};
set(H,props,vals))
上記のステートメントは次の 2 つのステートメントと同等です。
set(H(1),'PropertyName1',Property11Value,'PropertyName2',Property12Value) set(H(2),'PropertyName1',Property21Value,'PropertyName2',Property22Value)
スカラー ハンドルを指定してプロパティ名を指定しない場合、set で H のクラスの各プロパティに対し、1 つのフィールドをもつ struct を返します。各フィールドには空の cell 配列が 1 つ含まれています。
SV = set(h);
ヒント
set への 1 回の呼び出しで、プロパティ名/プロパティ値の cell 配列の任意の組み合わせ、(プロパティ名としてのフィールド名およびプロパティ値としてのフィールド値をもつ) 構造体配列、および cell 配列を使用できます。
matlab.mixin.SetGet から導出されたクラス
このサンプル クラスでは set/get インターフェイスを定義し、継承されたメソッドの動作について説明します。
classdef LineType < matlab.mixin.SetGet properties Style = '-' Marker = 'o' end properties (SetAccess = protected) Units = 'points' end methods function obj = LineType(s,m) if nargin > 0 obj.Style = s; obj.Marker = m; end end function set.Style(obj,val) if ~(strcmpi(val,'-') ||... strcmpi(val,'--') ||... strcmpi(val,'..')) error('Invalid line style ') end obj.Style = val; end function set.Marker(obj,val) if ~isstrprop(val,'graphic') error('Marker must be a visible character') end obj.Marker = val; end end end
クラスのインスタンスを作成し、そのハンドルを保存します。
h = LineType('--','*');
継承された get メソッドを使用して、任意のオブジェクト プロパティの値をクエリします。
get(h,'Marker')
ans = '*'
継承された set メソッドを使用して、任意のプロパティの値をクエリします。
set(h,'Marker','Q')
set および get を使用したプロパティ アクセス メソッドの呼び出し
set メソッドおよび get メソッドが使用される場合、MATLAB はプロパティ アクセス メソッド (LineType クラスの set.Style または set.Marker) を呼び出します。
set(h,'Style','-.-')
Error using LineType/set.Style (line 20) Invalid line style
プロパティ アクセス メソッドの詳細については、プロパティの get メソッドおよび set メソッドを参照してください。
すべてのプロパティの一覧表示
get を使用して、オブジェクト プロパティとそれらの現在値を含む struct を返します。
h = LineType('--','*'); SV = get(h)
SV =
struct with fields:
Style: '--'
Marker: '*'
Units: 'points'set を使用して、public の SetAccess をもつプロパティを含む struct を返します。
S = set(h)
S =
struct with fields:
Style: {}
Marker: {}LineType クラスは Units プロパティを SetAccess = protected により定義します。したがって、S = set(h) は S に Units のフィールドを作成しません。
set は、パブリックでない set アクセスをもつプロパティの可能な値を返すことができません。
ハンドル配列と get の使用
LineType オブジェクトの配列を作成するとします。
H = [LineType('..','z'),LineType('--','q')]
H =
1x2 LineType with properties:
Style
Marker
UnitsH がハンドル配列の場合は、get ではプロパティ値の 1 つの (length(H) 行 1 列) cell 配列が返されます。
CV = get(H,'Style')
CV =
2×1 cell array
{'..'}
{'--'}H がハンドル配列であり、プロパティ名を指定しない場合は、get はプロパティ名に対応する名前をもつフィールドを含む struct 配列を返します。H がスカラーでない場合は、get の出力を変数に割り当てます。
SV = get(H)
SV =
2x1 struct array with fields:
Style
Marker
UnitsMarker プロパティの値を構造体の配列 SV の 2 番目の配列要素から取得します。
SV(2).Marker
ans = 'q'
ハンドル、名前および値の配列
ハンドル配列、プロパティ名の cell 配列、プロパティ値の cell 配列を set に渡すことができます。プロパティ値の cell 配列には H の各オブジェクトに対してプロパティ値の行が 1 行なければなりません。各行にはプロパティ名配列の各プロパティに対して値が含まれていなければなりません。
H = [LineType('..','z'),LineType('--','q')]; set(H,{'Style','Marker'},{'..','o';'--','x'})
set に対するこの呼び出しの結果は次のとおりです。
H(1)
ans =
LineType with properties:
Style: '..'
Marker: 'o'
Units: 'pointsH(2)
ans =
LineType with properties:
Style: '--'
Marker: 'x'
Units: 'points'プロパティ リストのカスタマイズ
ユーザーのサブクラスに次のメソッドを再定義することによって、プロパティ リストの表示方法をカスタマイズできます。
プロパティ名の部分一致に対する優先順位の設定
matlab.mixin.SetGet から派生するクラスでは、PartialMatchPriority プロパティ属性を使用して、名前の部分一致で使用する相対的な優先順位を指定することができます。MATLAB は、複数のプロパティ名に一致する、不完全で大文字小文字を区別しないテキスト文字列を解決するときに、この属性を適用します。
継承された set および get メソッドは、不正確な名前の文字列に起因するあいまいさがない場合、不正確なプロパティ名を解決できます。名前が複数のプロパティに一致するためにプロパティ名の部分一致があいまいになる場合、PartialMatchPriority 属性値によって、MATLAB がどのプロパティに一致させるかが決まります。
既定の優先順位は、PartialMatchPriority = 1 と等価です。プロパティの相対的な優先順位を下げるには、PartialMatchPriority を 2 以上の正の整数値に設定します。PartialMatchPriority の値が大きくなるにつれて、プロパティの優先順位は下がります。
たとえば次のクラスでは、Verbosity プロパティは Version プロパティより名前一致における優先順位が高くなっています。
classdef MyClass < matlab.mixin.SetGet properties Verbosity end properties (PartialMatchPriority = 2) Version end end
あいまいと見なされる可能性のある不正確な名前 Ver を使用して set メソッドを呼び出すと、相対的な優先順位が高い Verbosity プロパティが設定されます。PartialMatchPriority 属性を設定しない場合、あいまいな名前はエラーの原因となります。
a = MyClass;
set(a,"Ver",10)
disp(a) MyClass with properties:
Verbosity: 10
Version: []同じ名前選択が、get メソッドにも適用されます。
v = get(a,"Ver")v =
10
大文字小文字と名前の一致
大文字小文字の一致しない完全な名前一致は、プロパティの優先順位がより高い部分一致よりも優先されます。たとえば、次のクラスでは、BaseLine プロパティを優先順位 1 (既定値)、Base プロパティを優先順位 2 (1 より優先順位が低い) と定義しています。
classdef MyClass < matlab.mixin.SetGet properties BaseLine end properties (PartialMatchPriority = 2) Base end end
文字列 base を使用して set メソッドを呼び出すと、Base プロパティが設定されます。BaseLine のほうが優先順位が高いものの、大文字小文字の異なる名前の完全一致が優先されます。
a = MyClass;
set(a,"base",-2)
disp(a) MyClass with properties:
BaseLine: []
Base: -2新規プロパティを追加する際の非互換性の軽減
新規プロパティを追加する際にコードの非互換性の発生を避けるため、PartialMatchPriority 属性を使用できます。たとえば、次のクラスは、文字列 Dis を使用して set メソッドと get メソッドで Distance プロパティを参照できます。これは、DiscreteSamples プロパティのほうが優先順位が低いためです。
classdef Planet < matlab.mixin.SetGet % Version 1.0 properties Distance end properties(PartialMatchPriority = 2) DiscreteSamples end end
このクラスの Version 2.0 では、Discontinuities というプロパティが導入されています。既存のコードでプロパティ名のあいまいな部分一致が発生する可能性を防ぐには、PartialMatchPriority を使用して Discontinuities の優先順位を既存のプロパティより低くします。
classdef Planet < matlab.mixin.SetGet % Version 2.0 properties Diameter; NumMoons = 0 ApparentMagnitude; DistanceFromSun; end properties(PartialMatchPriority = 2) DiscreteSamples; end properties(PartialMatchPriority = 3) Discontinuities = false; end end
Planet クラスの Version 1.0 では、set メソッドへの次の呼び出しはあいまいではありませんでした。
p = Planet;
set(p,"Disc",true)しかし、Discontinuities プロパティの導入により、文字列 Disc があいまいになります。Discontinuities プロパティの優先順位を低くすることで、文字列 Disc が引き続き DiscreteSamples プロパティに一致するようになります。
メモ
再利用可能なコードを記述する際は、大文字小文字を区別しない完全なプロパティ名を使用することによりあいまいさが回避され、後続のソフトウェア リリースでの非互換性が防止され、コードが読みやすくなります。
参考
set | get | matlab.mixin.SetGet | matlab.mixin.SetGetExactNames