Main Content

プロパティ構文

このトピックでは、properties...end ブロックを使用して、MATLAB® でクラス プロパティを定義する方法を説明し、プロパティ検証の構文と概念を紹介します。また、クラス インスタンスからのプロパティ値の取得と設定に関する基本も説明します。

プロパティ定義ブロック

キーワード propertiesend は、同じ属性設定をもつ、1 つ以上のクラス プロパティを定義します。以下は、プロパティ ブロックを定義する一般的な構文です。

properties (attributes)
   propName1
   ...
   propNameN
end

メモ

プロパティの名前は、そのクラスと同じ名前や、そのクラスにより定義された他のメンバーの名前と同じであってはいけません。

たとえば、以下のプロパティ ブロックでは、SetAccess 属性を private に設定した 2 つのプロパティを定義しています。この属性設定は、プロパティ値を設定できるのは PrivateProps クラスのメンバーのみであることを示しています。

classdef PrivateProps
   properties (SetAccess = private)
      Property1
      Property2
   end
end

プロパティに対して、属性が異なる複数のプロパティ ブロックを定義することもできます。以下の例では、1 つのプロパティ ブロックでプライベート SetAccess をもつプロパティを定義し、2 番目のブロックで抽象プロパティを定義しています。属性が異なるプロパティ ブロックは、クラス定義の中で任意の順序で記述できます。

classdef MultiplePropBlocks
   properties (SetAccess = private)
      Property1
      Property2
   end
   properties (Abstract)
      Property3
   end
end

プロパティの属性の完全な一覧は、プロパティの属性を参照してください。

プロパティ検証構文

プロパティ ブロック内で、プロパティ検証を使用できます。プロパティ検証では、サイズとクラスを含む、各プロパティ値に 1 つ以上の制限を課すことができます。それぞれのプロパティに既定値を指定することもできます。プロパティ検証の一般的な構文は次のとおりです。

properties (attributes)
   propName1 (dimensions) class {validators} = defaultValue
   ...
end

  • (dimensions) — プロパティ値のサイズ。(1,2)(1,:) のように、かっこで囲まれた 2 つ以上の数値のコンマ区切りリストとして指定します。コロンを使用すると、その次元で任意の長さを許可できます。値の次元は (dimensions) と完全に一致するか、互換性がなければなりません。詳細については、基本的な演算で互換性のある配列サイズを参照してください。(dimensions) には式を含めることができません。

  • class — プロパティ値のクラス。double など、クラスの名前として指定します。この値は、指定されたクラスまたは変換可能なクラスでなければなりません。たとえば、double を指定するプロパティは、single 型の値を受け入れ、それらを double に変換します。MATLAB で既に利用できるクラス以外に、独自のクラスをプロパティ検証として使用できます。ユーザー定義のクラスの場合、プロパティ検証により、指定された class のサブクラスをエラーなく渡すことができますが、サブクラスはスーパークラスに変換されません。

  • {validators} — 検証関数。mustBePositivemustBeScalarOrEmpty など、中かっこで囲まれたコンマ区切りリストとして指定します。class とは異なり、検証関数はプロパティ値を変更しません。検証関数は、プロパティ値がその条件と一致しない場合はエラーになります。検証関数の一覧は、プロパティの検証関数を参照してください。独自の検証関数を定義することもできます。

  • defaultValue — 既定のプロパティ値は、指定されたサイズ、クラス、検証ルールに準拠しなければなりません。既定値は式にすることもできます。クラスの初期化は、クラスを最初に使用する直前に発生します。MATLAB が既定値の表現を評価する方法の詳細は、既定値をもつプロパティの定義を参照してください。

このクラスは 1 つのプロパティを定義します。プロパティ ブロックには明示的な属性は定義されていません。これはパブリック プロパティのブロックを定義することと同じです。MyPublicData は正の double のベクトルでなければならず、既定値は [1 1 1] です。

classdef ValidationExample
   properties
      MyPublicData (1,:) double {mustBePositive} = [1 1 1]
   end  
end

すべての検証オプションを一度に使用する必要はなく、同じブロック内のそれぞれのプロパティが異なる検証の組み合わせを使用できます。この例では、RestrictedByClass プロパティはクラス検証のみを使用していますが、RestrictedByFunction は検証関数を使用し、既定値を代入しています。

classdef DifferentValidation
   properties
      RestrictedByClass uint32
      RestrictedByFunction {mustBeInteger} = 0
   end
end

詳細については、プロパティのクラスとサイズの検証プロパティの検証関数を参照してください。

プロパティ アクセス構文

プロパティにアクセスする構文は、MATLAB 構造体のフィールド構文と類似しています。たとえば、obj がクラスのオブジェクトであれば、プロパティ名を参照することでプロパティの値を取得できます。

val = obj.PropertyName

等号の左側にプロパティ参照を置くことにより、プロパティに値を代入します。

obj.PropertyName = val

たとえば、ValidationExample クラスをインスタンス化し、MyPublicData の値を読み取ります。

classdef ValidationExample
   properties
      MyPublicData (1,:) double {mustBePositive} = [1 1 1]
   end  
end
x = ValidationExample;
x.MyPublicData
ans =

     1     1     1

プロパティに対して定義された検証に合格する、新しい値をそのプロパティに代入します。

x.MyPublicData = [2 3 5 7];

この構造体フィールド構文を使用した場合に MATLAB で自動的に呼び出される、get メソッドと set メソッドをオプションで定義できます。詳細については、プロパティの get メソッドおよび set メソッドを参照してください。

変数を使用したプロパティの参照

MATLAB は、以下の形式の式を使用して変数 string または char からプロパティ名を解決します。

object.(PropertyNameVar)

PropertyNameVar は、有効なオブジェクト プロパティの名前を含む変数です。この構文は、プロパティ名を引数として渡すときに使用します。たとえば、関数 getPropValueKeyType プロパティの値を返します。

PropName = "KeyType";
function o = getPropValue(obj,PropName)
   o = obj.(PropName);
end

関連するトピック