単純なクラスの作成
クラスの設計
クラスの基本的な目的は、データとそのデータで実行される操作をカプセル化するオブジェクトを定義することです。たとえば、BasicClass
は 1 つのプロパティと、そのプロパティに含まれるデータに対し実行される 2 つのメソッドを定義します。
Value
— クラスのオブジェクトに保存された数値データを含むプロパティroundOff
— プロパティの値を小数点以下 2 桁に丸めるメソッドmultiplyBy
— プロパティの値を指定された数値で乗算するメソッド
classdef
ブロックを使用してクラス定義を開始してから、そのブロック内でクラス プロパティとメソッドを定義します。以下は ClassName
...endBasicClass
の定義です。
classdef BasicClass properties Value {mustBeNumeric} end methods function r = roundOff(obj) r = round([obj.Value],2); end function r = multiplyBy(obj,n) r = [obj.Value]*n; end end end
クラスの構文の概要は、classdef
を参照してください。
クラスを使用するには、次の手順に従います。
クラス定義を、クラスと同じ名前の
.m
ファイルに保存します。クラスのオブジェクトを作成します。
プロパティにアクセスしてデータを代入します。
メソッドを呼び出してデータに対し演算を行います。
オブジェクトの作成
クラス名を使用してクラスのオブジェクトを作成します。
a = BasicClass
a = BasicClass with properties: Value: []
最初、プロパティ値は空です。
プロパティへのアクセス
オブジェクト変数とドットをプロパティ名の前に付けて、Value
プロパティに値を代入します。
a.Value = pi/3;
プロパティ値を返すには、代入項なしでドット表記を使用します。
a.Value
ans = 1.0472
クラス プロパティの詳細については、プロパティ構文を参照してください。
メソッドの呼び出し
roundOff
メソッドを a
オブジェクトに対して呼び出します。
roundOff(a)
ans = 1.0500
次に示す multiplyBy
メソッドの呼び出しのように、複数の引数を取るメソッドには、オブジェクトを 1 番目の引数として渡します。
multiplyBy(a,3)
ans = 3.1416
また、ドット表記を使用してメソッドを呼び出すこともできます。
a.multiplyBy(3)
ドット表記を使用する場合、オブジェクトを明示的に引数として渡す必要はありません。表記は、ドットの左のオブジェクトを使用します。
クラス メソッドの詳細については、メソッドの構文を参照してください。
コンストラクターの追加
クラスでは、コンストラクターと呼ばれる、クラスのオブジェクトを作成するための特別なメソッドを定義できます。コンストラクター メソッドでは、コンストラクターに引数を渡して、プロパティ値として代入することができます。BasicClass
の Value
プロパティは、関数 mustBeNumeric
を使用して、可能な値を制限します。
以下は BasicClass
クラスのコンストラクターです。入力引数を指定してコンストラクターを呼び出すと、Value
プロパティに代入されます。入力引数を指定せずにコンストラクターを呼び出すと、Value
プロパティの既定値は空 ([]
) になります。
methods function obj = BasicClass(val) if nargin == 1 obj.Value = val; end end end
このコンストラクターをクラス定義に追加して、以下のように 1 ステップでオブジェクトを作成してプロパティ値を設定できます。
a = BasicClass(pi/3)
a = BasicClass with properties: Value: 1.0472
コンストラクターは、クラスのオブジェクト作成に関連するその他の操作を実行できます。
コンストラクターの詳細については、クラス コンストラクター メソッドを参照してください。
メソッドのベクトル化
MATLAB® では演算をベクトル化することができます。たとえば、ベクトルに数値を加算できます。
[1 2 3] + 2
ans = 3 4 5
MATLAB は数値 2
を配列 [1 2 3]
の各要素に加算します。算術演算子メソッドをベクトル化するには、obj.Value
プロパティ参照を大かっこで囲みます。
[obj.Value] + 2
この構文により、メソッドがオブジェクトの配列を操作できるようになります。たとえば、インデックス付き代入を使用してオブジェクト配列を作成します。
obj(1) = BasicClass(2.7984); obj(2) = BasicClass(sin(pi/3)); obj(3) = BasicClass(7);
次の 2 つの式は同じものになります。
[obj.Value] + 2 [obj(1).Value obj(2).Value obj(3).Value] + 2
プロパティ参照が大かっこで囲まれているため、roundOff
メソッドはベクトル化されます。
r = round([obj.Value],2);
roundOff
はベクトル化されているため、配列を処理できます。roundOff(obj)
ans = 2.8000 0.8700 7.0000
関数のオーバーロード
クラスでは、既存の MATLAB 関数と同じ名前でメソッドを定義することにより、加算などの既存の機能を実装できます。たとえば、2 つの BasicClass
オブジェクトを加算するとします。各オブジェクトの Value
プロパティの値を加算するのが理に適っています。
次に示すのは、MATLAB の関数 plus
のオーバーロードされたバージョンです。BasicClass
クラスの加算をプロパティ値の加算として定義します。
methods function r = plus(o1,o2) r = [o1.Value] + [o2.Value]; end end
plus
というメソッドを実装することにより、BasicClass
のオブジェクトに "+
" 演算子を使用できるようになります。
a = BasicClass(pi/3); b = BasicClass(pi/4); a + b
ans = 1.8326
plus メソッドをベクトル化することにより、オブジェクト配列を処理できます。
a = BasicClass(pi/3); b = BasicClass(pi/4); c = BasicClass(pi/2); ar = [a b]; ar + c
ans = 2.6180 2.3562
関連情報
関数のオーバーロードについての詳細は、クラス定義での関数のオーバーロードを参照してください。
演算子のオーバーロードについての詳細は、演算子のオーバーロードを参照してください。
BasicClass
のコード リスト
以下は、このトピックで取り上げた機能を追加した後の BasicClass
の定義です。
classdef BasicClass properties Value {mustBeNumeric} end methods function obj = BasicClass(val) if nargin == 1 obj.Value = val; end end function r = roundOff(obj) r = round([obj.Value],2); end function r = multiplyBy(obj,n) r = [obj.Value] * n; end function r = plus(o1,o2) r = [o1.Value] + [o2.Value]; end end end