プロパティの 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 Units
H
がハンドル配列の場合は、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 Units
Marker
プロパティの値を構造体の配列 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: 'points
H(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